資料結構與演算法整理總結---二分查詢

lxzoliver發表於2020-04-06

⼆分查詢針對的是⼀個有序的資料集合,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對⽐,將待查詢的區間縮⼩為之前的⼀半,直到找到要查詢的元素,或者區間被縮⼩為0。

⼆分查詢是⼀種⾮常⾼效的查詢演算法,我們假設資料⼤⼩是n,每次查詢後資料都會縮⼩為原來的⼀半,也就是會除以2。最壞情況下,直到查詢區間被縮⼩為空, 才停⽌。

資料結構與演算法整理總結---二分查詢

可以看出來,這是⼀個等⽐數列。其中n/2k=1時,k的值就是總共縮⼩的次數。⽽每⼀次縮⼩操作只涉及兩個資料的⼤⼩⽐較,所以,經過了k次區間縮⼩操作,時間複雜度就是O(k)。通過n/2k=1,我們可以求得k=log2n,所以時間複雜度就是O(logn)。

<?php
    $arr = [0,4,6,8,23,45,54,88,123];
    function search($array,$low,$high,$value){
        if($low>$high){
            return false;
        }
        $mid = ($low+$high)/2;
        if($arr[$mid] == $value){
            return $mid;
        }else if($arr[$mid]<$value){
            return search($array,$mid+1,$high,$value);
        }else{
            return search($array,$low,$mid-1,$value);
        }
    }
    search($arr,0,count($arr),23);

⼆分查詢應⽤場景的侷限性

⼆分查詢依賴的是順序表結構,簡單點說就是陣列。

那⼆分查詢能否依賴其他資料結構呢?⽐如連結串列。答案是不可以的,主要原因是⼆分查詢演算法需要按照下標隨機訪問元素。我們在陣列和連結串列那兩節講過,陣列按照下標隨機訪問資料的時間複雜度是O(1),⽽連結串列隨機訪問的時間複雜度是O(n)。所以,如果資料使⽤連結串列儲存,⼆分查詢的時間複雜就會變得很⾼。

⼆分查詢針對的是有序資料。

⼆分查詢對這⼀點的要求⽐較苛刻,資料必須是有序的。如果資料沒有序,我們需要先排序。

資料量太⼩不適合⼆分查詢

如果要處理的資料量很⼩,完全沒有必要⽤⼆分查詢,順序遍歷就⾜夠了。

資料量太⼤也不適合⼆分查詢

⼆分查詢的底層需要依賴陣列這種資料結構,⽽陣列為了⽀持隨機訪問的特性,要求記憶體空間連續,對記憶體的要求⽐較苛刻。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章