-
什么是列表查找;
-
順序查找(線性查找);
-
二分查找;
-
順序查找與二分查找比較;
-
運行時間;
-
增速問題
一:什么是查找
二:順序查找(線性查找):從列表中查找指定的元素
定義:從列表的第一個元素開始,順序進行搜索,直到找到元素或搜索到列表最后一個元素為止。
-
輸入:列表、帶查找的元素
-
輸出:元素下標(未找到元素是一般返回None/-1)
-
內置列表查找函數:index()
1 #線性查找的代碼實現 2 #enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。 3 #教程:https://www.runoob.com/python3/python3-func-enumerate.html 4 def linear_search(li,var): 5 for index,v enumerate(li): 6 if v == var: 7 return index 8 else: 9 return None 10 復雜度:范圍是列表(n),一個for循環====》O(n) 從頭到尾遍歷每個元素
三:二分查找定義
又叫折半查找,從有序列表(必須為有序)的初始候選區list[o:n]開始,通過對待查找的值與候選區中間值的比較,可以使候選區減少一半。(僅當列表為有序的時候,二分查找才管用)
舉例:從下面列表中查找3元素:

首先我們需要對候選區做一個了解,這樣有助於我們更好的理解,
在上面的列表中我們使1所在的位置為left,9所在的位置為right,這樣從left-right就是候選區,


候選區中間值(mid) =(left-right)// 2;如果我們需要查找的值(val)大於候選區中間值(mid),則左邊的值為:left = mid+1 ,right不變,候選區為:【(mid+1),right】;相反:查找的值(val)小於候選區中間值(mid),則left不變,右邊值為:right = mid - 1,候選區為【left, ( mid -1)】


然后依次進行取值,其中left、mid、right都是指的值的下標;如果最后left>right,則表示該范圍沒有所需要的值。
代碼如下:
1 def Binary_search(li,val): #li傳入的列表,val所需要的值 2 '''定義值''' 3 left = 0 4 right = len(li) - 1 5 while left <= right: #候選區有值 6 mid = (right+left) // 2 #候選區中間值 7 if li[mid] == val: 8 return mid 9 elif li[mid] > val: #帶查找的值在中間值(mid)的左側 10 right = mid -1 11 else: #li[mid] < val 帶查找的值在中間值(mid)的右側 12 left = mid + 1 13 else: 14 return None
四:順序查找與二分查找比較
我們在使用大O表示法討論運行時間時,log指的都是log2。使用簡單查找法查 找元素時,在最糟情況下需要查看每個元素。
因此,如果列表包含8個數字,你最多需要檢查8 個數字。而使用二分查找時,最多需要檢查log n個元素。如果列表包含8個元素,你最多需要 檢查3個元素,因為log 8 = 3(2^3 = 8)。如果列表包含1024個元素,你最多需要檢查10個元素, 因為log 1024 = 10(2^10 =1024)。
五:兩者運行時間
選擇算法的時候我們本能的選擇效率最高的,以最大限度的減少運行時間或者占用空間。
如果列表包含100個數字,順序查找最多需要猜100次,40億個數字,則最多需要才40億次;順序查找最多需要猜測的次數與列表長度相同==》運行時間線性時間。
二分查找的話最多猜7次,40億最多猜32(log2^32)次===>運行時間表示為對數時間。
六:增速問題 (算法的運行時間以不同的速度增加 )
