一、列表查找:從列表中查找指定元素
- 輸入:列表、待查找元素
- 輸出:元素下標或未查找到元素
二、列表查找方式
- 順序查找 : 從列表的第一個元素開始遍歷,知道找到為止。時間復雜度O(n)
- 二分查找 :從有序的列表的候選區L[0:n]開始,通過堆待查找的值與候選區中間值進行比較,每次候選區數減少一半,時間復雜度O(logn)
順序查找
def linear_search(data_set, value): for i in range(range(data_set)): if data_set[i] == value: return i return
三、二分查找
不使用遞歸的方式:
def binary_search(l,n): low = 0 hight = len(l) while low <= hight: mid = (low + hight) // 2 if l[mid][id] < n: print(l[mid]) low = mid + 1 elif l[mid][id] > n: print(l[mid]) hight = mid - 1 else: return mid
使用遞歸的方式:
def binary_search(l,aim,start= 0,end=None): if end == None:end = len(l) - 1 if start <= end: # (end - start) // 2 + start 兩種方法 mid = (end + start) // 2 #12 18 if l[mid] < aim: return func(l,aim,start = mid + 1,end = end) # [42,43,55,56,66,67,69,72,76,82,83,88] elif l[mid] > aim: return func(l,aim,start = start,end = mid - 1) elif l[mid] == aim: return mid else: return None
要求列表是有序的,所以python中列表的查找,並不是采用的二分查找。
四、練習
LetCode網站題目: 現有一個學員信息列表(按id增序排列),格式為: stu_info = [ {id:1001, "name":"張三", "age":20}, {id:1002, "name":"李四", "age":25}, {id:1004, "name":"王五", "age":23}, {id:1007, "name":"趙六", "age":33} ] 修改二分查找代碼,輸入學生id,輸出該學生在列表中的下標,並輸出完整學生信息。
def binary_search(l,n): low = 0 hight = len(l) while low <= hight: mid = (low + hight) // 2 if l[mid][id] < n: print(l[mid]) low = mid + 1 elif l[mid][id] > n: print(l[mid]) hight = mid - 1 else: return mid ret = binary_search(stu_info,1004) print(ret)