使用「哨兵」減小時間複雜度

2021-08-13 20:42:40 字數 1118 閱讀 1694

今天介紹乙個很簡單的演算法,雖然簡單,對於減少執行時間卻有挺好 的效果。

問題描述:對乙個陣列,該陣列存放的數各都不同,即有唯一性。

對該陣列進行查詢,返回資料對應為a的序號。

data[4]=a,就返回乙個4

常規的做法是這樣的:

//假設 陣列長度為10

intcheck(int a)

//如有a,返回其位置,沒有則返回-1

另一種做法是這樣的

首先,陣列在儲存的時候,將第乙個空間即data[0]空出來。

//陣列長度為11 儲存十個不同的數 data[0]不用。

intcheck(int a)

//如有a,返回其位置,沒有則返回0

程式1 遍歷整個陣列,一旦找到a 就返回。

每次迴圈判斷兩次:i<10;data[i]==a

程式2 一樣遍歷整個陣列,一旦找到a就返回

每次迴圈判斷兩次:data[i]!=a

很明顯可以看到與之前程式的不同:第一次,函式為了保證陣列訪問時不溢位,同時也為了結束迴圈,加了乙個判斷i<10。噹噹訪問到最後乙個數是觸發條件,退出迴圈。

第二次,函式先令data[0]=a,如同在陣列邊界處設立了乙個「哨兵」,查詢時從後向前查詢,一直判斷是不是a,如果找到就觸發條件退出,如果遇到了哨兵,依然觸發條件退出,不會在越過陣列邊界。從而省去了一次判斷過程。節省了一半的時間。

顯然還可以將之推廣到鍊錶

當然平時的小練習,可能根本就不在乎這點時間,但是如果對於乙個公司,乙個成品軟體,對於特別特別多的資料,這一半的時間就有很大的作用。用兩個小時才能查詢的資料如果能用乙個小時查詢出來,無疑是乙個大的飛躍。

還有就是,哨兵只適用於查詢那些唯一性的資料,比如查詢學生的學號等等。

dfs時間複雜度 時間複雜度 空間複雜度

時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...