算法图解(二分查找)

Posted parisgabriel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解(二分查找)相关的知识,希望对你有一定的参考价值。

前言:

今天是第一篇 以后尽量每天写 看具体时间安排吧 目前一边学Python、Java、Go还有算法 所以写的比较少

主要是Python一天差不多16小时吧 Java、go看时间安排 这次算法全是用Python演示的 不懂Python的也没关系

或者可以看一下我前面的帖子

算法是什么:

算法是一只组完成任务的指令  要么速度快、要么能解决问题

应该说是为实现某些目的的逻辑 以及 思想 的代码

 

二分查找

 

假设你要查找电话本里k开头的人 里可能会直接滑动到中间 因为你知道k在中间位置

因为电话本是abcdef排序的嘛

定义:

 二分查找就指从中间开始查找的逻辑做法

注:

# 二分查找必须是有序序列  返回其位置

# 无序无法进行二分查找   返回null

例如:

技术分享图片

二分查找:

  利用二分查找每次取中间数 有小数可以向上或向下取整数

  100以内的数字   最多7次可以找出来   

普通查找:

  而普通查找则是从头到位遍历最好的情况是1 一次找出

      最差是100次

 

二分查找随着元素的增加并不会改变太大

普通查找则会随元素的增加而增加

比如说一个字典内有240000个单词

普通查找最差情况:240000次 出结果

二分查找最差情况:17次出结果

这就很明显的突出了二分算法的优势

####这里我用()括号里的数字代表log的下标

用二分查找最多需要log(2)n步

其实就是利用对数运算:

对数运算:

      定义: 幂运算的逆运算

例如:

      10**2 = 100      log(10)100 = 2

      10**3 = 1000    log(10)1000=3

      2**5 = 32          log(2)32 = 5

如果有8个元素 你最多需要查找3次   因为long8 = 3(2**3=8)

1024个元素  最多需要 检查10个元素  因为 1024 = 10(2**10=1024)

def binary(lst, item):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = round((low + high) / 2)
        guess = lst[mid]
        if guess == item:   # 猜对了
            return mid
        if guess > item:
            high = mid - 1  # 猜大了
        else:
            low = mid + 1   # 猜小了
    return None


my_list = [1, 3, 5, 7, 9]
print(binary(my_list, 3))    # 1 返回的元素下标  索引是0开始的
print(binary(my_list, -1))   # None   因为不存在-1元素

技术分享图片

 

运行时间:

  线性时间(linear time)

        100个数字最多猜100次  40亿猜40亿次  最多猜的次数等于列表的长度

  对数时间(或log时间)

    100个数字最多猜7次  40亿猜32次  

大O表示法:

     简单查找每个元素 需要n次 运行时间为O(n)

   二分查找 运行时间为O(log(n))

        大O表示法计算的是操作数

  O(log n) 对数时间  包括二分查找

  O(n)  线性时间

  O(n * log n)快速排序算法

  O(n**2)速度较慢排序法算法

  O(n!)非常慢的算法

 

小结:

     二分查找比简单查找快的多

     O(log n)比O(n)快,需要搜索的元素越多,前者比后者就快的越多

  算法运行时间并不以秒为单位

  算法运行时间是从其增速的角度度量的

  算法的运行时间用大O表示法表示

 

以上是关于算法图解(二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

算法图解1 - 二分查找和大O表示法

《算法图解》代码实现和改进

图解二分查找算法 -- python实现

图解二分查找的递归和非递归实现

算法图解

算法图解