資料結構與演算法,二分查詢

2021-08-08 18:17:11 字數 1302 閱讀 5688

1.時間複雜度:

每次能去掉一半即 logn

2.實現方式:

while迴圈 與 遞迴

我更推薦 while 迴圈,因為遞迴有個潛在的問題就是 stack over flow(堆疊溢位),而且在實際工程中是盡量避免遞迴的。雖然遞迴寫起來方便,也不容易出錯。

3.實現關鍵點

我總結了下,一共有以下四點

start + 1 < end

這個是 while 迴圈條件,即退出迴圈的條件是 start +1 >= end,首先來看 start + 1 == end 這個時候,start 和 end 是相鄰的關係。start > end 兩者相交了。而且這樣的寫法不可能出現死迴圈,比如下面這種寫法很容易就出現了死迴圈。

while (start < end)  else 

}

mid = start + (end - start)/2

這個寫法看起來很妖豔兒,有點裝逼,實際上能還是很有用的。因為傳統的寫法 (start + end) / 2 ,這樣有個潛在的問題,就是如果 start ,end 足夠大的話就會出現溢位的問題。這個點可以看出工程師還是很細心的。

source[mid] ==, <, >

迴圈開始,根據mid和target的關係,看看怎麼移動 end、start 指標,根據具體題目移動。一般來說等於 mid 就可以了

退出迴圈後,判斷 start 、 end 和 target 的關係。

下面直接上**了,這樣寫的好處是只用處理最後兩個數的邏輯,很容易擴充套件。類似於遞迴到最底層只處理1個或者的關係。

+ (nsinteger)binarysearch:(nsarray *)source target:(nsinteger)target 

nsinteger start = 0;

nsinteger

end = source.count - 1;

nsinteger mid = 0;

while (start + 1

< end) else

if ([source[mid] integervalue] > target) else

}if ([source[start] integervalue] == target)

if ([source[end] integervalue] == target)

return -1;

}

資料結構與演算法 二分查詢

二分查詢的思想是在已經排序 公升序 的陣列中,如果要查詢的數比中位數小,那麼其位置只可能在左半部分,相反只能在右半部分。這樣每次把查詢區間縮小一半,比順序查詢效率快得多。非遞迴寫法 public static int binarysearchinasclooply int nums,int star...

資料結構與演算法 二分查詢

基礎概念 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用陣列作為表的儲存結構。不妨設有序表是遞增有序的。通俗理解 每次首先找到陣列的中間位置 middle 然後把待查詢數 target 與middle進行比較。如果查詢數target ...

資料結構與演算法 二分查詢

以浙大mooc題目為背景進行非遞迴實現。list結構定義如下 typedef int position typedef struct lnode list struct lnode l是使用者傳入的乙個線性表,其中elementtype元素可以通過 進行比較,並且題目保證傳入的資料是遞增有序的。函式...