二分查找要求元素是有序的,它在查找算法中算是比较快的,也是很重要的查找方式。
假如有1-100的连续的多个数字,有一个数(item), 要求你最快的方式找到他的位置,你需要先猜index最中间的数,
如果这个中间的数大于item,说明这个数在还在左边一半部分
大概的逻辑如下:
arr=[2,4,6,7,10,24,34,55,77] item = 6 ===>
arr[4]=10 > 6 ===>
arr = [2,4,6,7] ====>
arr[1]=4 < 6 ====>
arr=[6,7]
arr[1] == 6
对于包含n个元素的列表,用二分查找最多需要log2n步(多少个2相乘得到n),假如有16个元素,最多需要4步可以得到元素所在位置。
下面是简单实现:
def binary_search(arr, item):
low = 0
height = len(arr)-1
while low <= height:
mid = (height + low) // 2
guess = arr[mid]
# [1..{20}.50.{66}..100]
if guess > item: # 往左边缩小
height = mid - 1
elif guess < item: # 往右边缩小
low = mid + 1
else:
return mid
return None
a = [2,4,6,7,10,24,34,55,77]
print(binary_search(a, 55))
// 操作符,忽略小数点。
In [1]: 3//2
Out[1]: 1
当guess>item的时候,height = mid - 1, 往左边缩小,low不变,
当guess
引用《算法图解》