算法圖解第一章(二分查找法,運行時間,大O表示法)

一、引言(代碼都是用python寫的):

如果有100個數讓你猜,你可能會用循環列舉1到100依次檢驗,計算機的計算效率相比人高太多,這當然可以,但是假如你去字典中查找單詞,而單詞有240000個,你就需要240000步,而如果使用二分法,僅僅需要17步!一般而言,對於包含n個元素的列表,用二分法找最多需要log2\log_2n步,而簡單查找最多需要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指的是log2\log_2

四、大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)快,當需要搜索的元素越多時,前者比後者快得越多。

結語:

算法圖解這本書正在學習,如果有志同道合的朋友可以一起學習。這本書的電子版可以去我主頁簡介裏有獲取方法。

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