一、引言(代碼都是用python寫的):
如果有100個數讓你猜,你可能會用循環列舉1到100依次檢驗,計算機的計算效率相比人高太多,這當然可以,但是假如你去字典中查找單詞,而單詞有240000個,你就需要240000步,而如果使用二分法,僅僅需要17步!一般而言,對於包含n個元素的列表,用二分法找最多需要n步,而簡單查找最多需要n步!
二、代碼(二分查找法):
注意:僅當列表是有序的時候,二分查找才管用。
函數裏的low保存的是下限(小的那個數),high保存的是上限(大的那個數)
def search(list,item): #list存儲的需要在該列表裏查找item
low=0 #low存儲的是下限
high=len(list)-1 #列表從0開始,所以上限list[i]中的i應爲長度減一
while low<=high: #只要範圍沒有縮小大隻有一個元素,就繼續循環
mid=int((low+high)/2) #上限加下限除以2等於中間那個數
guess=list[mid]
if guess==item: #恰巧中間那個數就是我們要找的那個數item
return mid
if guess>item: #說明要找的數item比中間數小,則修改上限即可
high=mid-1 #上限改爲中間數減一,中間數已經判斷過不等於item
if guess<=item:
low=mid+1
return None #表示未找到該元素
list=[1,2,3,4,5,6,7,8,9] #索引從0開始。雖簡單,但容易忽略。
x=search(list,4)
print (x)
結果:
3
三、運行時間
1、每次介紹算法時,我都將討論其運行時間。一般而言,應選擇效率最高的算
法,以最大限度地減少運行時間或佔用空間。
2、二分查找可以節省多長時間呢?如果列表包含100個數字,最多需要猜100此。如果列表包含40億個數字,最多需要猜40億次,最多需要猜測的次數與列表長度相同,這被稱爲線性時間。
3、二分查找則不同。如果列表包含100個元素,最多需要猜7次;40億個數字最多猜32次。二分查找的運行時間爲對數時間(或log時間)(討論運行時間時,log指的是)
四、大O表示法
1、通過運行時間第(3)點我們知道,隨着列表的增長,二分查找的速度比簡單查找快得多。而大O表示法指出了算法有多快。
2、假設列表包含n個元素,簡單查找需要執行n次操作,二分查找需要執行log n次操作,使用大O表示法,這個運行時間分別爲O(n)、O(log n)。沒有單位秒,因爲大O表示法是讓你能夠比較操作數。他指出了算法運行時間的增速。
3、大O表示法:
之所以叫大O表示法,就是因爲操作數前有個大O。
五、理解不同的大O運行時間
顯然2中算法的時間爲:
算法1:O(n)
算法2:O(log n)
總結:
1、大O表示法指出了最糟糕情況下的運行時間。例如:有10張從1到10的卡片,你要抽出一張10,你可能第一張就抽中了,但是大O表示法是假如你第10次才抽中。
2、算法的速度指的並非時間,並不以秒爲單位,而是操作數的增速。
3、談論算法的速度時,我們說的是隨着輸入的增加,其運行時間將以什麼樣的速度增加。
4、算法的運行時間用大O表示法表示。
5、O(log n)比O(n)快,當需要搜索的元素越多時,前者比後者快得越多。
結語:
算法圖解這本書正在學習,如果有志同道合的朋友可以一起學習。這本書的電子版可以去我主頁簡介裏有獲取方法。