图解算法 第一章 二分查找

算法入门二分查找和大O表示法

二分查找
  1. 提出问题

​ 我们要在字典中查找单词hello的意思,改如何快速的查到到他?

​ 在没有目录的情况下,最笨的方法就是从字典第一页开始找,找到hello为止。相信有点经验的小伙伴都不会这样做。

​ 另一种是从中间为止开始找,比如从首字母o开始,然后确定hello在o的前面还是后面。这基本是二分查找的原理。

2.图示,在0~100 中查找出一个数字的过程
图解算法 第一章 二分查找_第1张图片

第一步已经排除了50个数

图解算法 第一章 二分查找_第2张图片

再排除了26个数

图解算法 第一章 二分查找_第3张图片

再总结上面找单词的例子。如果词典中有240K个单词,那我我们查找到指定单词只需要17步。
图解算法 第一章 二分查找_第4张图片

总结而言。使用二分法查找需要的步数为log n。

PS:关于log函数 一般只写log 表示log以2为底
图解算法 第一章 二分查找_第5张图片

二分查找的代码

def linary_search(numbers,item):
    //获取头尾index
    low = 0
    high = len(numbers)-1

    //在头尾不重合的情况下,一直循环
    while low < high:
        mid = int((low +high)/2)
        guess = numbers[mid]
        if guess == item:
            return mid
        if guess > item:
            high =mid-1
        else:
            low =mid +1
    return None

def main():
 myList = [1,2,3,4,5,6,7,8,9,10]
 mid = linary_search(myList,-1)
 print(mid)

大O表示法

大O表示法,是算法性能的的一种表达方式。一般算法性能会考虑运算时间和运算次数。入上面的简单查找,用大O表示法表达这个运算的速度O(n) ,最差的情况是需要查找所有数,才可以找到目标数。用二分查找法O(log n).表示二分查找的次数。

n表示的是原始值的数量。如一个数组的长度或者是一个字段中单词的个数。如果执行一次需要0.1秒,下面4种算法的执行时间如下所示
图解算法 第一章 二分查找_第6张图片

最后一个n! 表示n的阶乘。如4! 表示 4*3*2*1 的结果。在做有序的排列组合时候的运算次数为n! 。如有小明,小红,小华,小亮四个同学要排队进入教室。一共有多少中排队方式的结果就是 4!

很多曲线公式在高中时期已经学习过。每中曲线都代表了一种算法。后面我们会介绍。

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