演算法 二分查詢的時間複雜度為O(log2N)的原因推理
阿新 • • 發佈:2019-01-10
由於二分查詢每次查詢都是從陣列中間切開查詢,所以每次查詢,剩餘的查詢數為上一次的一半,從下表可以清晰的看出查詢次數與剩餘元素數量對應關係
表-查詢次數及剩餘數
第幾次查詢 | 剩餘待查詢元素數量 |
1 | N/2 |
2 | N/(2^2) |
3 | N/(2^3) |
… | … |
K | N/(2^K) |
從上表可以看出N/(2^K)肯定是大於等於1,也就是N/(2^K)>=1,我們計算時間複雜度是按照最壞的情況
N/(2^K)=1
=>N=2^K
=>K=log2N
所以二分查詢的時間複雜度為O(log2N)
程式碼
/**
* 二分查詢
* @param arr 指定查詢的陣列
* @param searchNum 要查詢的數字
* @return 返回查詢的的結果(陣列中的索引),沒有則返回-1
*/
public static int binerySearch(int[] arr, int searchNum) {
// 初始化左側索引
int leftIndex = 0;
// 初始化右側索引
int rightIndex = arr.length - 1;
while (leftIndex <= rightIndex) {
// 計算中間索引
int mid = (leftIndex + rightIndex) >>> 1;//主要防止溢位,就是除以2的意思
// 如果查詢的數等於中間索引對應的數組裡的數,則返回mid索引,並退出迴圈
if (searchNum == arr[mid]) {
return mid;
}
// 判斷並計算右側索引
if (searchNum < arr[mid]) {
rightIndex = mid - 1;
}
// 判斷並計算左側索引
if (searchNum > arr[mid]) {
leftIndex = mid + 1;
}
}
return -1;
}