python二分法查找算法_python之路-二分法查找
楔子
如果有這樣一個(gè)列表,讓你從這個(gè)列表中找到66的位置,你要怎么做?
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
你說,so easy!
l.index(66)...
我們之所以用index方法可以找到,是因?yàn)閜ython幫我們實(shí)現(xiàn)了查找方法。如果,index方法不給你用了。。。你還能找到這個(gè)66么?
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
i = 0
for num in l:
if num == 66:
print(i)
i+=1
上面這個(gè)方法就實(shí)現(xiàn)了從一個(gè)列表中找到66所在的位置了。
但我們現(xiàn)在是怎么找到這個(gè)數(shù)的呀?是不是循環(huán)這個(gè)列表,一個(gè)一個(gè)的找的呀?假如我們這個(gè)列表特別長(zhǎng),里面好好幾十萬個(gè)數(shù),那我們找一個(gè)數(shù)如果運(yùn)氣不好的話是不是要對(duì)比十幾萬次?這樣效率太低了,我們得想一個(gè)新辦法。
二分查找算法
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
你觀察這個(gè)列表,這是不是一個(gè)從小到大排序的有序列表呀?
如果這樣,假如我要找的數(shù)比列表中間的數(shù)還大,是不是我直接在列表的后半邊找就行了?
這就是二分查找算法!
那么落實(shí)到代碼上我們應(yīng)該怎么實(shí)現(xiàn)呢?
簡(jiǎn)單版二分法
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,aim):
mid = (len(l)-1)//2
if l:
if aim > l[mid]:
func(l[mid+1:],aim)
elif aim < l[mid]:
func(l[:mid],aim)
elif aim == l[mid]:
print("bingo",mid)
else:
print('找不到')
func(l,66)
func(l,6)
升級(jí)版二分法
def search(num,l,start=None,end=None):
start = start if start else 0
end = end if end is None else len(l) - 1
mid = (end - start)//2 + start
if start > end:
return None
elif l[mid] > num :
return search(num,l,start,mid-1)
elif l[mid] < num:
return search(num,l,mid+1,end)
elif l[mid] == num:
return mid
總結(jié)
以上是生活随笔為你收集整理的python二分法查找算法_python之路-二分法查找的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu python_Ubuntu
- 下一篇: python正则匹配ip地址_Pytho