《图解算法》阅读02—二分法

二分查找

二分查找应该是比较基础的算法了,但是自己太渣了,一切要从头开始复习。查找问题都可以使用二分查找的算法来解决。

二分查找的输入是一个有序的元素列表,如果查找的元素在列表中,二分法返回其位置,否在返回空值。

更佳的查找方法

我们直接利用简单查找法对列表进行查询是低效的。举个书中提到的例子,我们经常的聚会中玩的猜数字游戏。目标数字在1-100之间,我们简单地从1一直按照顺序往后猜是低效的,如果把猜中时猜数字的次数看作一个随机事件,那么我们平均要猜50次才会猜到目标数字。
从书中提供的角度理解二分法,如果使用二分法猜数字,第一次猜50,那么至少可以排除一半的数字,而简单的查找方法仅仅排除一个数字。
二分法查找的本质就在于,每次查找的剩下部分的中间数字,从而将余下的数字排除一半。
100个元素采用二分法在7次之内能够找到,240000个单词在18步之内能够找到。对于包含n个元素的列表,使用二分查找最多查找log2n步,简单查找最多需要n步。

算法的实现

该算法实现使用的数据结构是数组(bucket),函数binary_search接受一个有序数组和一个元素。如果指定元素包含在数组中,这个函数将返回其位置。
算法的实现有两个重点:

  • 函数的终止条件是什么:我们知道列表中可能存在变量也可能不存在变量,因此我们算法的终止条件,应该是整个搜寻的终止条件。首先我们知道,当标志搜索区的两个标志相遇是一定会终止;第二当搜索到变量时也会终止。
  • 利用两个标志变量代表搜寻的过程(low 和 high)
  • 特别注意对low 和high两个变量的更新极其容易陷入死循环
```python
// An highlighted block 
#二分法实现
#python 3.7
#小灿 2018-11-30
def binary_search(list,item):
    """函数输入一个列表,利用二分法完成查找,返回元素所在的位置"""
    low = 0
    high = len(list)-1 
    mid = int((low+high)/2)
    
    while  low <= high:
        if list[mid] != item:
            if list[mid] < item:
                low = mid+1
            if list[mid] > item:
                high = mid-1
            mid = int((low + high)/2)
        else:
            return (mid+1)
            break
            
list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
item = int(input('请输入一个1-20需要查找的数字:'))
mid = binary_search(list,item)
print('你要查找的数字的位置是:'+str(mid))

运行时间

最多需要猜测的次数与列表长度相同,被称为线性时间(linear time)。
二分法查找的运行时间为对数时间(或log时间)。

你可能感兴趣的:(算法)