Binary Search - 二分查找

之前趁当当网大折扣的时候,和朋友一起凑数,买了一本《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

你可能感兴趣的:(Binary Search - 二分查找)