zoukankan      html  css  js  c++  java
  • 算法图解(二分查找)

    前言:

    今天是第一篇 以后尽量每天写 看具体时间安排吧 目前一边学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表示法表示

  • 相关阅读:
    IIS配置(持续更新中...)
    T-SQL Table-valued Function使用分隔符将字符串转换为表
    英语中的时态
    网页内容扫描器
    20145223 杨梦云 《网络对抗》 Web安全基础实践
    20145223 杨梦云 《网络对抗》 Web基础
    20145223 杨梦云 《网络对抗》 网络欺诈技术防范
    20145223 杨梦云 《网络对抗》 信息搜集与漏洞扫描
    20145223 杨梦云 《网络对抗》 MSF基础应用
    20145223 杨梦云 《网络对抗》恶意代码分析
  • 原文地址:https://www.cnblogs.com/ParisGabriel/p/9417052.html
Copyright © 2011-2022 走看看