二分查找:算法
每次可以排除掉一半的數據. 查找的效率很是高. 可是侷限性比較大. 要求: 查找的序列必須是有序序列spa
# 判斷n是否在lst中出現. 若是出現請返回n所在的位置 # 二分查找---非遞歸算法
def bin_search(li, val):
low = 0
high = len(li)-1
while low <= high: # 只要候選區不空,繼續循環
mid = (low + high) // 2
if li[mid] == val:
return mid
elif li[mid] < val:
low = mid + 1
else: # li[mid] > val
high = mid - 1
return -1
普通遞歸版本二分法 def binary_search(n, left, right): if left <= right: middle = (left+right) // 2 if n < lst[middle]: right = middle - 1 elif n > lst[middle]: left = middle + 1 else: return middle return binary_search(n, left, right) # 這個return必需要加. 不然接收 到的永遠是None. else: return -1 print(binary_search(567, 0, len(lst)-1))
# 另類⼆分法, 很難計算位置. def binary_search(ls, target): left = 0 right = len(ls) - 1 if left > right: print("不在這⾥") middle = (left + right) // 2 if target < ls[middle]: return binary_search(ls[:middle], target) elif target > ls[middle]: return binary_search(ls[middle+1:], target) else: print("在這⾥") binary_search(lst, 567)
時間複雜度最低, 空間複雜度最低
lst1 = [5,6,7,8] lst2 = [0,0,0,0,0,1,1,1,1] for el in lst1: lst2[el] = 1 lst2[4] == 1 # o(1)