Binary Search - 二分查找
2018-08-07 本文已影响21人
捡个七
之前趁当当网大折扣的时候,和朋友一起凑数,买了一本《grokking algorithms》。最近有空翻开,发现里面的讲解深入显出,很适合算法小白。而且书中配合着漫画一起讲解很是有趣。在这里记录学习这本算法书的一些笔记。
算法是一组完成任务的指令。任何代码片段都可以视为算法。--《grokking algorithms》
算法说明
二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回 null 。
拿一个具体的例子来说明,比如要猜测 1-100 中的一个数字。
- 第一种方法:
从 1 开始按顺序猜,对方会给与“大了”或者“小了”的回答。猜“1”,“小了”;接着猜“2”,“小了”;...... 直到猜到对的数为止。这种方法称为简单查找。更确切的说法是“傻找”。因为如果正确数字为 99 的话总共要猜测 99 次才能正确。 - 第二种方法:
每次都从中间的数开始猜测。第一次猜“50”,“小了”。这样会排出掉 1-50 的数,即排除了一半的数。再接着猜“75”,“大了”,这样又会排除掉一半的数字。如此猜测,最终会快速的猜测出正确答案。这种方法就是二分查找。猜 1- 100 中的一个数字最多需要 7 步,即要猜中正确数字的话,在 7 次之内都能猜到。
一般而言,对于包含 n 个元素的列表,用二分查找最多需要 log2n 步。
Python 代码实现
def binary_search(list, item):
low = 0
high = len(list) - 1
while low <= high :
mid = (low + high) % 2
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1
return None
-------------------------------------------------------
>>> num_list = [1, 3, 5, 7, 9]
>>> binary_search(num_list, 3)
1