Python二分查找的三种思路
生活随笔
收集整理的這篇文章主要介紹了
Python二分查找的三种思路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二分查找的條件:
1.列表是有序的
2.掐頭去尾去中間
第一種(最普通的方式):
lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56] n = 5 left = 0 right = len(lst) - 1 middle = 0 while left <= right:#如果,left==right了,證明左右兩邊重疊了,如果有這個值,就是left==right時,如果沒有那么,直接跳出循環走后面的else就可以了middle = (left + right) // 2if lst[middle] > n:#如果中間值的值,大于想要查找的值,那么想要的值在左側,所以把右邊的right要向左移動。#移動到哪呢?中間值,都比n大,所以移動到middle的左邊right=middle-1right = middle - 1elif lst[middle] < n:#中間值小于n,那么n就在右側,所以向右移動left,移動到哪呢?中間值都小于n,所以left= middle+1left = middle + 1else:print('找到了')break else:print('沒有啊')第二種(遞歸):這種方式是,改變列表的長度,所以在使用二分查找時,要知道什么是可以變的,什么是不可以改變的。
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def func(n, lst):left = 0right = len(lst) - 1if lst != []:mid = (left + right)//2if n > lst[mid]:func(n, lst[mid+1:]) # 改變列表elif n < lst[mid]:func(n, lst[:mid])# 改變列表else:print("找到了")returnelse:print("沒找到")returnn = int(input("請輸入你要查找的數:")) func(n, [1,3,5,7,12,36,68,79]) # 78第三種(遞歸+函數返回索引):
def func(n, lst, left, right): # 遞歸找到什么是可以變的. 什么是不可以變的if left <= right:mid = (left + right) // 2if n > lst[mid]:left = mid + 1return func(n, lst, left, right)elif n < lst[mid]:right = mid - 1return func(n, lst, left, right) # 遞歸如果有返回值. 所有調用遞歸的地方必須寫returnelse:print("找到了")return mid # 難點else:print("找不到")return -1n = int(input("請輸入你要查找的數:")) lst = [1,3,55,98,37,41,2,5,1,4] ret = func(n, lst, 0, len(lst)-1) # 78 print(ret)說一下,第三種的返回值的問題。因為,調用一次函數,就會在內存中,為這個函數生成一個局部命名空間。返回值,只會返還給調用它的地方,所以需要一層一層的往上返回。這樣開始的地方才可以接收到相應的索引。
這也是一種查找對應數字的方式,相對來說,這種方式是比較省時省空間的。
lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56,34, 22]#列表無序也沒關系 new_lst = [] for i in range(57):#找到列表中最大的值,然后給一個新的列表賦值,而且設置為0new_lst.append(0)for i in lst:#把需要查找的列表中的每個數字當做所以,并且給對應的索引設置的值為1new_lst[i] = 1n = 12 #次數如果比new_lst的長度還大,直接返回,沒有這個數就可以了 if new_lst[n] == 1:#把n當做索引取出值,看看里面的值是不是等于1,等于1時,證明n在這個列表里,否則就不在這個列表里print('在呢') else:print('不在')總結
以上是生活随笔為你收集整理的Python二分查找的三种思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 循环列表删除元素的注意事项
- 下一篇: 四步解读python生成器