動畫:二分查找(上) | 面試官問我如何在 1 億數據中快速查找某一整數?(上)

關注公衆號,小鹿動畫學編程,一天一篇動畫餵飽你!

在這裏插入圖片描述

寫在前邊

今天就來學習一下在一組有序數據中如何快速查找一個數。也就是我們所說的二分查找,雖然很多小夥伴對二分查找很熟悉,但是到了真正的應用問題上,還是不能更好的來把握二分的思想。要想把這部分把握好,還需要真正的體驗一下二分查找的強大的效率。

如題目中所述,如果你今天去面試,面試官要問你如何在十個數中查找一個整數,那麼你很快就會想到從頭到尾遍歷就可以。

但是隨着面試難度的加大,面試官會問你如何在 10 萬、100萬、1000萬甚至一個億數據中查找一個數,你該如何解決?要想達到效率最低,空間消耗的少,那不得不走進今天的二分查找。


目錄


一、什麼是二分查找

二分查找在生活中無處不在,舉個例子。我們有沒有小時候玩過猜數字的遊戲,給你一組數字,我拿出一個數字,你每猜一個數,我就會告訴你你猜的數和正確的數的大小關係,然後再繼續猜,直到猜到爲止。

當時玩的時候,基本就是瞎猜。那我們想想如何做到最快的能夠猜出它的正確值是多少?我們每次可以取最小值和最大值中間的數字來猜,如果小於正確數字我們再進行折中,直到猜到爲止,這是最快的查找方法。

通過這個例子,想必你已經掌握了二分的思想。小結一下,就是在一個有序數據中,將數據折中,每次折中的數據和要查找的數據進行對比,然後不斷的縮小查找的區間,直到查找到或者區間爲 0 爲止。


二、動畫實現

在這裏插入圖片描述

三、二分查找的性能

既然我們說二分查找很快,那到底快到那?有多快?總之不能口頭說吧?

那我們就證明一下,假設我們有 n 個數據,每次查找都會折半,也就是 n/2。最好情況是一次就能查找到,最壞的情況就是最後一次纔可以查找到。其實這就是涉及到我們高中的數學中的問題,如下圖:
在這裏插入圖片描述
假設我們折半了 m 次之後不能再折半了,每次折半只需完成對比操作,經過 m 次折半之後,n/2的 m 次方等於 1,那麼m = log2n。我們可以得到時間複雜度爲O(logn)。

那麼問題來了,O(logn)的時間複雜度執行效率高嗎?那我們看文章中面試官給出 1 億數據只需查找大約 26 次,可以看出效率非常高了。

其實對數對應相反的就是指數,指數大家都很瞭解吧,越到後邊越是瘋狂指數增長。


四、二分實現的三個重點

上邊我們已經把二分查找的思想掌握了,那我們開始動手寫寫代碼。據瞭解,二分查找的出現和實現一個正確的二分查找代碼中間相差了 16 年的時間,可以看出二分查找涉及到的細節還是挺多的,但是古人總結了,我們記住,知道爲什麼,理解了寫出一個二分查找還是很容易的。

1、JavaScript 版本

在這裏插入圖片描述

2、Java 版本

3、C 語言版本

在這裏插入圖片描述

4、Python 版本

4.1 循環退出條件

假如我們在循環退出的時候,讓low指針小於high指針,而不是等於,會出現什麼問題呢?這一步大家一定用代碼去實踐一遍纔會印象深刻。這個問題留給大家,下邊留言區說出你的實踐,答對者,小鹿獎勵紅包一個。


4.2 中位數的取值

我們一般取中位數的值是(low + hight)/ 2。那麼問題來了,如果low和high的和超出了整數的範圍我們咋辦?

有兩種解決辦法,第一種是用low+(high-low)/2的方式,另外一種是用位運算low+((high-low) >> 1)。


4.3 兩個指針的移動

所謂的兩個指針的位置移動更新也就是low和high的更新,如果我們查找完一圈,沒有對low和high加 1 操作,會出現什麼情況呢?同樣下邊留言,親自實踐,給出截圖正確答案者,發紅包一個。


五、二分的三個適用條件

5.1 二分必須是順序結構

我們前邊學順序結構的有順序棧和順序隊列,其實它們的底層實現都是藉助數組,所以所謂的順序結構就是數組的實現。

我們要思考一個問題,爲什麼非要藉助數組而不是鏈表呢?嗯,想起來了,數組的優點是什麼?你能想到吧,咱們之前的文章也寫的非常詳細,那就是隨機訪問的時間複雜度爲 O(1)。而鏈表卻不是,所以這就是我們藉助順序結構的原因,這樣二分查找更快。

思考:如果我們在鏈表上添加索引,實現二分查找,會不會是另外一番景象?提示一下,可以瞭解一下跳錶,就是藉助單鏈表加索引實現的。


5.2 數據必須有序的

爲什麼數據是有序的?我們想想如果數據無序的話,那大小關係就亂了,而且在得知中位數與查找的數據大小關係時,其他數據是亂的,所以無序的數據對於二分查找是不適用的。


5.3 數據量不能太大也不能太小

文章開頭我們從 10 個數據中查找一個數據,我們直接遍歷就可以了,這是數據量小的情況下。

如果數據量很大,我們想一下,我們是基於數組實現二分查找的,數組的一個特點是什麼,內存空間是連續的,所以說數據量太大,在內存中開闢連續的內存空間很喫力的。所以太大的數據量也不適合二分查找。


5.4 小結

做個小結,今天主要分享了二分查找的思想以及應用,還有二分查找使用中應注意的地方,後邊對於什麼情況下適用於二分查找,什麼情況不適合於二分查找,原因是什麼這都是重點,都要去掌握。

今天分享的二叉樹是沒有重複數據的,如果有重複數據我們該怎麼解決?會在下一篇具體的進行講解。

對於海量數據查找還有一些其他的數據結構,比如散列表、二叉樹等,這個不急,咱們慢慢的更新,先把最基本的學好,其他就很好學了。


下一篇:動畫:二分查找(下) |面試官問我如何在 20 萬 IP 地址中快速定位某一歸屬地?


推薦閱讀

1、別翻了,必學十大排序算法,看這篇就夠了
2、別在學習框架了,那些讓你起飛的計算機基礎知識。
3、大學四年,我把私藏的自學「學習網站/實用工具」都貢獻出來了


❤️ 不要忘記留下你學習的腳印 [點贊 + 收藏 + 評論]

❤️ 本文首發於原創公衆號:「小鹿動畫學編程」更多優質文章請關注小鹿的公衆號幺。

一個致力於初學者動畫學習編程的公衆號,後臺回覆“資料”,即可獲取小鹿自學以來整理資料一份。

在這裏插入圖片描述
在這裏插入圖片描述

作者Info:

【作者】:小鹿

【原創公衆號】:小鹿動畫學編程。

【簡介】:和小鹿同學一起用動畫的方式從零基礎學編程,將 Web前端領域、數據結構與算法、網絡原理等通俗易懂的呈獻給小夥伴。先定個小目標,原創 1000 篇的動畫技術文章,和各位小夥伴共同努力一起學習!公衆號回覆 “資料” 送一從零自學資料大禮包!

【轉載說明】:轉載請說明出處,謝謝合作!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章