查詢演算法之二分查詢

坤少_jkson發表於2020-10-09

1. 概念

        二分查詢(Binary Search)演算法,也叫折半查詢演算法、二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為0。類似生活中猜字遊戲,它的時間複雜度是O(logn),適用於經常查詢的、但是不變的(增刪)的有序列表。雖然查詢效率很高,但也有一定的侷限性,二分查詢依賴順序表結構,那麼只能使用陣列作為底層資料結構,陣列按照下標隨機訪問資料的時間複雜度是O(1),而連結串列隨機訪問的時間複雜度是O(n),並且資料量太大和太小也不適合二分查詢。

2.原理​​​

1)找出位於陣列中間的值,並存放在一個變數中mid中,並和target進行比較
2)如果target值大於mid,則把陣列中間位置作為下一次計算的起點進行比較。
3)如果target值小於mid,則把陣列中間位置作為下一次計算的終點進行比較。
4)如果target值等於mid,則返回陣列下標

3.演算法分析

時間複雜度:O(logn)

4.參考連結

https://www.jianshu.com/p/78b505a6abf4

5.測試用例

public class BinarySearchDemo {


    /**
     * 普通版本 參考 Arrays.binarySearch0
     * @param a
     *@param fromIndex
     * @param toIndex
     * @param target
     * @return
     */
    private static int binarySearch0(int[] a, int fromIndex, int toIndex, int target) {
        int low = fromIndex;
        int high = toIndex - 1;
        while (low <= high) {
           // int mid = (low + high) >>> 1;
            //這種不容易記憶體溢位
            int mid = low + ((high - low) >> 1);
            int midVal = a[mid];
            if (midVal < target){
                low = mid + 1;
            }else if (midVal > target){
                high = mid - 1;
            }else{
                // key found
                return mid;
            }
        }
        // key not found.
        return -(low + 1);
    }




    /**
     * 遞迴實現
     * @param array
     * @param fromIndex
     * @param toIndex
     * @param target
     * @return
     * @throws Exception
     */
    public static int binarySearch(int[] array, int fromIndex, int toIndex, int target) {
        if (fromIndex <= toIndex) {
            int middle = (fromIndex + toIndex) >>> 1;
            if (array[middle] == target) {
                return middle;
            } else if (array[middle] < target) {
                return binarySearch(array, middle+1, toIndex, target);
            } else {
                return binarySearch(array, fromIndex, middle-1, target);
            }
        }
        return -1;
    }




    public static void main(String[] args) {
        int[] array=new int[]{2,3,4,5,6,7};
        int result = binarySearch(array,0,array.length,3);
        System.out.println(result);
    }


}

 

相關文章