演算法與資料結構學習筆記(7) 有序表查詢之二分查詢

2021-09-25 19:41:43 字數 1359 閱讀 7135

(1)使用前提

線性表中的記錄必須是有序的(通常是從小到大),線性表必須採用順序儲存。

(2)演算法思路

在有序表中,取中間值作為比較物件,若給定值與中間記錄的值相等,則查詢成功;若小於中間記錄的值,則在中間記錄的左半區繼續查詢;若大於中間記錄的值,則在中間記錄的右半區繼續查詢。不斷重複上述過程即可。

(3)演算法複雜度為o(logn)

(4)無重複元素的二分查詢

public static int binarysearch(int arr,int num)else if(num < arr[mid])else if(num > arr[mid])

}return -1;

}

易錯點1:

這裡的中值不能寫為(start + end)/2,因為若start和end都是很大的int,那麼它們的和可能會大於int的最大值,導致溢位。

易錯點2:

這裡不能寫為end = mid,表面上這樣更改後符合演算法原理,但是,當要搜尋的值較大且不存在與陣列時,會導致程式有乙個時刻end = start + 1,這就會導致程式無限迴圈(比如,start = 19,end = 20,然而,arr[start] = 100,end[end] = 1000,而要查詢的值是500,那麼程式就會一直無線迴圈,mid一直為19+(20-19)/2=19,所以程式出錯)。因此,程式這裡寫為end = mid - 1,因為,反正arr[mid]已經不等於,所以mid - 1可以直接將arr[mid]這個值排除在下一次的迴圈中。

易錯點3:

與易錯點2是同樣的道理。

(5)有重複元素的二分查詢

public static int binarysearch(int arr,int num)

else

}if(num == arr[start])

return start; //易錯點3:若找到了,則返回索引start

return -1;

}

易錯點1:

在易錯點2處的**為end = mid的情況下,若迴圈條件改為<=,那麼可能會出現無限迴圈的情況。

易錯點2:

在num <= arr[mid]的情況下,則第一次重複元的下標應該在區間[start,mid]中。(注意是閉區間,因為mid位置處也可能是解,故不能改為)

易錯點3:

當執行完while迴圈後,如果匹配到了值,那麼要返回第乙個重重複的元素的索引為start。

演算法與資料結構學習筆記(8) 有序表查詢之插值查詢

插值查詢事實上是一種二分查詢的一種改進。陣列中元素不能有重複。當陣列中的資料分布極度不均與時,如 0,1,2,2000,2001,99998 如果用二分查詢,那麼查詢的次數會很多。而插值查詢就適合這種極端不均勻的資料。即兩種演算法的區別只有在計算mid時的係數不同 插值查詢 二分查詢 mid的係數為...

資料結構學習筆記 2 資料結構與演算法

四.演算法設計的要求 五.演算法效率的度量方法 六.函式的漸近增長 七.演算法時間複雜度 八.常見的時間複雜度 九.最壞情況與平均情況 十.演算法空間複雜度 資料結構是底層,演算法高層。資料結構為演算法提供服務。演算法圍繞資料結構操作。演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序...

《演算法與資料結構》學習筆記4 鍊錶(上)

本次分兩篇來記錄鍊錶的內容。與陣列相比,鍊錶是一種稍微複雜一點的資料結構。這兩個非常基礎 非常常用的資料結構,常常將會放到一塊兒來比較。兩者有什麼區別 從底層的儲存結構上來看 從下圖中我們看到,陣列需要一塊連續的記憶體空間來儲存,對記憶體的要求比較高。如果申請乙個 100mb 大小的陣列,當記憶體中...