算法之二分查找(上)

文章來源:http://blog.seclibs.com/算法之二分查找上/算法

二分查找在平時的生活中也挺經常使用的,好比說之前玩的猜數遊戲,每次都取中間數,而後得知是大了,仍是小了,這個例子也就是二分查找。數組

好比下面的這個例子,要查找有沒有數值19,其中low和high是查找的區間的下標,mid是查找區域的中間值的下標。數據結構

二分查找的思想是比較容易理解的,並且它的時間複雜度也是比較低的。假設數據大小爲n,每次查找完後都會縮小一半,即爲除以2,最壞的狀況也就是一直到查找空間爲空的時候,因此它們的變化爲n,n/2,n/4,n/8,…,n/2k,當n/2k=1時,k即爲縮小的次數,由於每次都只涉及到兩個數的大小比較,因此k次操做的時間複雜度爲O(k),又由於n/2k=1,因此k=log2n,時間複雜度也就是O(logn),這是一個很是恐怖的數量級了,好比n爲2的32次方,大約是四十多億,用二分查找來查找裏面的一個數的話,最多比較32次也就能夠獲得這個值了,這是一個很是恐怖的狀況。blog

上面的原理已經很明確了,因此二分查找的實現並非很複雜,可是有一個前提條件,有序數組中不存在重複元素,只有在這個狀況下,二分查找的實現纔是相對簡單的,具體的實如今下一篇文章裏說起。排序


雖然二分查找時間複雜度低,查找起來很是高效,但它也有必定的適用條件的。遊戲

首先,二分查找是依賴於數組的,若是使用其餘的數據結構來實現的話,二分查找的時間複雜度將會變的很是高,由於數組在下標隨機訪問的時候,時間複雜度是O(1),而鏈表隨機訪問的時間複雜度是O(n)。內存

並且它必須是有序的,前面也說過排序算法,時間複雜度最低的爲O(nlogn),若是使用的場景是沒有大量的插入和刪除操做,一次排序能夠屢次查找的狀況,那排序所的成本就能夠被均攤,不然二分查找將再也不適用,動態數據集合的查找,咱們須要使用其餘的算法才能夠。文檔

最後就是要注意要查找的數據量不能太大或者過小,過小的話,遍歷就足以知足;太大的話,由於它是基於數組這種數據結構的,它所須要的連續的內存空間就是一個很是大的障礙。get


參考文檔博客

極客時間-數據結構與算法之美

文章首發公衆號和我的博客

公衆號:無意的夢囈(wuxinmengyi)

博客:http://blog.seclibs.com/

相關文章
相關標籤/搜索