小白的算法初识课堂(part1)--二分查找法
學習筆記
學習書目:《算法圖解》- Aditya Bhargava
二分查找法
算法是一組完成任務的指令,任何代碼片段都可視為算法。二分查找是一種算法,其輸入是一個有序的元素列表(必須有序的原因稍后解釋)。如果要查找的元素包含在列表中,二分查找返回其位置;否則返回null。
下面,我們玩一個猜數字游戲。我隨便想一個1~100的數字,而你的目標是以最少的次數猜到這個數字。
- 簡單查找
假設你從1開始依次往上猜,則每次猜測都只能排除一個數字,如果我想的數字是99,你得猜99次才能猜到!這是簡單查找,更準確的說法是傻找。
- 二分查找法
假設你從50開始猜數字,下面是我們的對話:
#----第1輪---- 你:猜50 我:小了 #----第2輪---- 你:猜75 我:大了 #----第3輪---- 你:猜63 我:大了 #----第4輪---- 你:猜56 我:對啦!我發現了,你每一次都猜余下數字的中間數字!比如,你猜50,我告訴你小了,你知道1 ~ 50都小了,所以就把1 ~ 50都排除,再選取56 ~ 100 的中間數字75,我又告訴你大了,你就把75~100排除,以此類推…
那么,你用的這種方法就是二分查找法。
一般而言,對于包含n個元素的列表,用二分查找法最多需要log2nlog_2 nlog2?n步,運行時間為對數時間;而簡單查找法最多則需要n步,運行時間為線性時間。
- python實現
控制臺輸出:
3大O表示法
大O表示法是一種特殊的表示法,指出了算法的速度有多快。現在,我們用簡單查找法和二分法來猜數字,假設一共有10,100,10,000和1,000,000,000個數字,查找一個元素要耗費1毫秒:
| 10毫秒 | 10毫秒 | 4毫秒 | 2.5 |
| 100 | 100毫秒 | 7毫秒 | 14.29 |
| 10000 | 10000毫秒 | 14毫秒 | 714.29 |
| 1000000000 | 1000000000毫秒 | 30毫秒 | 33333333.33 |
我們看到,隨著元素數量的增加,二分查找需要的額外時間并不多,而簡單查找需要的額外時間卻很多。因此,隨著列表的增長,二分查找的速度比簡單查找快得多。
因此,我們不能僅僅了解的算法運行時間,還需知道運行時間如何隨列表增長而增加。這正是大O表示法的用武之地,大O表示法指出了算法有多快:
例如,假設列表包含n 個元素。簡單查找需要檢查每個元素,因此需要執行n 次操作,使用大O表示法,這個運行時間為O(n);二分查找法則只需要執行log2nlog_2 nlog2?n步,,使用大O表示法,這個運行時間為O(log2nlog_2 nlog2?n)。需要注意的是,大O表示法指的運行時間并不以秒為單位,算法運行時間是從其增速的角度度量的。大O表示法讓你能夠比較操作數,它指出了算法運行時間的增速。
- 大O表示法指出了最糟情況下的運行時間
在從1~100猜數字游戲中,如果我設置被猜的數字為1,而你又用簡單查找法從1開始猜數字,那豈不是1次就猜到了?那簡單查找法的運行時間到底是O(n)還是O(1)呢?
簡單查找法的運行時間總是O(n),如果1次就找到了數字,那么將是最好的情形,但大O表示法說的是最差的情形。因此,你可以說,在最糟糕的情況下,簡單查找法的運行時間是O(n)。這是一個保證,你知道簡單查找的運行時間不可能超過O(n)。 說明除最糟情況下的運行時間外,我們還應該考慮平均情況的運行時間,這個知識點我們以后再說。
- 一些常見的大O運行時間
O(log n),也叫對數時間,這樣的算法包括二分查找。
O(n),也叫線性時間,這樣的算法包括簡單查找。
O(n * log n),這樣的算法包括第4章將介紹的快速排序,一種速度較快的排序算法。
O(n2),這樣的算法包括第2章將介紹的選擇排序,一種速度較慢的排序算法。
O(n!),這樣的算法包括接下來將介紹的旅行商問題的解決方案,一種非常慢的算法。
后記:還是想認認真真學學算法,一點點寫吧.
總結
以上是生活随笔為你收集整理的小白的算法初识课堂(part1)--二分查找法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R语言与主成分分析
- 下一篇: 小白的算法初识课堂(part2)--选择