1. 程式人生 > >演算法 二分查詢的時間複雜度為O(log2N)的原因推理

演算法 二分查詢的時間複雜度為O(log2N)的原因推理

由於二分查詢每次查詢都是從陣列中間切開查詢,所以每次查詢,剩餘的查詢數為上一次的一半,從下表可以清晰的看出查詢次數與剩餘元素數量對應關係

表-查詢次數及剩餘數

第幾次查詢 剩餘待查詢元素數量
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; }