二分查找

二分查找:算法

 每次可以排除掉一半的數據. 查找的效率很是高. 可是侷限性比較大.  要求: 查找的序列必須是有序序列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)
相關文章
相關標籤/搜索