二分查詢演算法的Python實現

2021-09-30 11:53:44 字數 1898 閱讀 5420

二分查詢

list.index()無法應對大規模資料的查詢,需要用其它方法解決,這裡談的就是二分查詢

在查詢方面,python中有list.index()的方法。例如:

>>> a=[2,4,1,9,3]           #list可以是無序,也可以是有序

>>> a.index(4) #找到後返回該值在list中的位置

1>>> a.index(5) #如果沒有該值,則報錯

traceback (most recent call last):

file "", line 1, in valueerror: 5 is not in list

這是python中基本的查詢方法,雖然簡單,但是,如果由於其時間複雜度為o(n),對於大規模的查詢恐怕是不足以勝任的。二分查詢就是一種替代方法。

基本步驟:

從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;

如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。

如果在某一步驟陣列為空,則代表找不到。

這種搜尋演算法每一次比較都使搜尋範圍縮小一半。時間複雜度:o(logn)

def binarysearch(lst, value,low,high):          #low,high是lst的查詢範圍

if high < low:

return -1

mid = (low + high)/2

if lst[mid] > value:

return binarysearch(lst, value, low, mid-1)

elif lst[mid] < value:

return binarysearch(lst, value, mid+1, high)

else:

return mid

#也可以不用遞迴方法,而採用迴圈,如下:

def bsearch(l, value):

lo, hi = 0, len(l)-1

while lo <= hi:

mid = (lo + hi) / 2

if l[mid] < value:

lo = mid + 1

elif value < l[mid]:

hi = mid - 1

else:

return mid

return -1

if __name__ == '__main__':

l = range(50)

print binarysearch(l,10,0,49)

print bsearch(l,10)

對於python,不能忽視其強大的標準庫。經查閱,發現標準庫中就有乙個模組,名為:bisect。其文件中有這樣一句話:

看官就憑藉自己的英語水平理解吧。這段話的關鍵點是在說明:

下面演示這個模組的乙個函式

from bisect import *

def bisectsearch(lst, x):

i = bisect_left(lst, x) #bisect_left(lst,x),得到x在已經排序的lst中的位置

if i != len(lst) and lst[i] == x:

return i

raise valueerror

if __name__=="__main__":

lst = sorted([2,5,3,8])

print bisectsearch(lst,5)

python模組,贊了。

查詢演算法 二分查詢python實現

二分查詢 時間複雜度為o logn 空間複雜度為o 1 二分查詢也叫做折半查詢,是一種在有序陣列中查詢某一特定元素的查詢演算法。查詢過程從中間元素開始。如果中間元素正好是要查詢的元素,則查詢過程結束。def binary search1 arr,value binary search1 尋找與val...

二分查詢演算法python實現

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其 缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成...

python實現二分查詢演算法

二分演算法採用分而治之的思想,演算法思路比較簡單,便直接附上一端 def binarysearch ll,x length len ll height length 1ini 0 while ini height mid ini height 2findx ll mid if findx x ret...