zoukankan      html  css  js  c++  java
  • 二分法查找

      如果让你在一堆数中,查看某个数是否存在?你会怎么找?

      按常识是不是一个一个看过去?这个我们就叫顺序查找

      最好的情况就是看到第一个就是你要的,就不会往下看了,但是如果是最后一个数是你想要的,这种情况下,查看次数就变成了数字的个数

      如果数很多时,比如亿计,会不会觉得效率很低

    def linear_search(li, val):
        for ind, v in enumerate(li):
            if v == val:
                return ind
        else:
            return None
    

      下面我们介绍的二分法查找,要比顺序查找有效的多,但是前提示是这堆数字要有序

      实现思路大体如下:

    • 取最中间数,拿它和查找值比较
    • 如果中间数大(假设数是从小到大排),那说要找的数在左边,排除右边
    • 取左边一半里的中间数,和查找值比较,这样又可以排除一半,这循环下去,直到找到或得到没有这个数

       编写二分法查找的代码时,注意左右边界的变化,以及取中间值比较,一直循环的条件就是左右边界不碰头left<=right

    def binary_search(li, val):
        left = 0
        right = len(li) - 1
        while left <= right:    # 候选区有值
            mid = (left + right) // 2
            if li[mid] == val:
                return mid
            elif li[mid] > val: # 带查找的值在mid左侧
                right = mid - 1
            else: # li[mid] < val 带查找的值在mid右侧
                left = mid + 1
        else:
            return None
    

      总结:二分法查找前提是有序的,当然排序也又是要多花时间的,用不用二分法查找看场景,如果你只是查一次,那二分法查找,反而更慢,因为排序,如果你查好多次,那就可以排好一次好,复用二分法查找

  • 相关阅读:
    spring中@value注解需要注意
    mysql创建utf-8字符集数据库
    Access denied for user 'root'@'localhost' (using password:YES) 解决方案[转]
    MySql 5.7.20安装
    Shiro 登录认证源码详解
    为什么说Java匿名内部类是残缺的闭包
    Java中的闭包之实例一
    使用Eclipse的Working Set管理项目
    glibc下载安装
    Struts2 整合 Hibernate 框架
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/10124690.html
Copyright © 2011-2022 走看看