python實現二分尋找及bisect模組的簡介

來源:互聯網
上載者:User

標籤:演算法   python   二分尋找   搜尋   遞迴   

在尋找方面,python中有list.index()的方法。

<span style="font-size:14px;">>>> a=[2,4,1,9,3]           #list可以是無序,也可以是有序>>> a.index(4)              #找到後返回該值在list中的位置1</span>
這是python中基本的尋找方法,雖然簡單,但是,如果由於其時間複雜度為O(n),對於大規模的查詢恐怕是不足以勝任的。二分尋找就是一種替代方法。

二分尋找的對象是:有序數組。這點特別需要注意。

演算法基本步驟:
1.從數組的中間元素開始,如果中間元素正好是要尋找的元素,則搜素過程結束;
2.如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中尋找,而且跟開始一樣從中間元素開始比較。
3.如果在某一步驟數組為空白,則代表找不到。
這種搜尋演算法每一次比較都使搜尋範圍縮小一半。時間複雜度:O(logn)

下面有兩種實現方法,一種是用遞迴,另一種是是用while迴圈控制。

def binarySearch1(lst,value,low,high):    if high < low:        return -1    mid = (low+high)/2    if lst[mid]>value:        return binarySearch1(lst,value,low,mid-1)    elif lst[mid]<value:        return binarySearch1(lst,value,mid+1,high)    else:        return middef binarySearch2(lst,value):    low,high = 0,len(lst)-1    while low<=high:        mid = (low+high)/2        if lst[mid]<value:            low = mid + 1        elif value<lst[mid]:            high = mid - 1        else:            return mid    return -1if __name__ == '__main__':    l = range(50)    print binarySearch1(l,10,0,49)    print binarySearch2(l,10)

python標準庫中還有一個灰常給力的模組,那就是bisect。這個庫接受有序的序列,內部實現就是二分。

import bisectdef binarySearch3(lst,x):    i = bisect.bisect_left(lst,x)    if i != len(lst) and lst[i] == x:        return i    raise ValueErrorif __name__ == '__main__':    lst = sorted([2,5,2,7,3])    print binarySearch3(lst,5)




python實現二分尋找及bisect模組的簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.