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
    

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

  • 相关阅读:
    Markdown
    DNS解析流程
    maven 的各种命令
    ES6初体验——(1)let和const命令
    table相关的选择器 & children()与find()的区别 & 选择器eq(n)与nth-child(n)的差异
    Java MD5加密类
    POI操作Excel异常Cannot get a text value from a numeric cell
    MyEclipse+SSH开发环境配置
    JdbcTemplate详解
    Spring配置声明
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/10124690.html
Copyright © 2011-2022 走看看