zoukankan      html  css  js  c++  java
  • 算法之二分查找PK线性查找

    列表查找(线性查找)

    本质就是列表的index()
    顺序查找 也叫线性查找,从列表第一个元素开始,顺序进行搜索,知道找到元素或搜索到列表最后一个元素为止。

    以下是示例代码:

    
    def line_search(li, val):
        for key, value in enumerate(li):
            if value == val:
                return key
        else:
            return None
    
    

    二分法查找(前提必须是一个有序的列表)

    通过取中间值,选择候选区,如果中间值大于要查找的值,则证明候选区在左边,更改右边的最大值为中间值的上一位,反之如果中间值小于要查找的值, 证明候选区在右边,则改变左边最小的值为中间值的下一位。如果右边的最大值跑到了左边最小值的左边,则说明候选区没有要找的值,程序结束。
    
    def binary_search(li, val):
        left = 0 # 最小值的下标
        right = len(li)-1 # z最大值的下标
        while left <= right:  # 候选区有值
            # mid是中间值的下标
            mid = (left+right) // 2
            if li[mid] == val:  # 找到了就返回索引
                return mid
            elif li[mid] < val:  # 如果中间值小于找的值,说明要找的值在右边候选区
                left = mid + 1
            else:
                right = mid - 1
        else:
            return None
    

    二分法和线性查找的比较

    
    import time
    
    def cal_time(func):
        def inner(*args):
            start = time.time()
            func(*args)
            end = time.time()
            print('run coding time %s' % (end-start))
        return inner
    from cal_time import cal_time
    
    
    
    @cal_time
    def binary_search(li, val):
        left = 0
        right = len(li)-1
        while left <= right:  # 候选区有值
            # mid是中间值的下标
            mid = (left+right) // 2
            if li[mid] == val:  # 找到了就返回索引
                return mid
            elif li[mid] < val:  # 如果中间值小于找的值,说明要找的值在右边候选区
                left = mid + 1
            else:
                right = mid - 1
        else:
            return None
    li = list(range(10000000))
    binary_search(li, 6678)
    
    @cal_time
    def line_search(li, val):
        for key, value in enumerate(li):
            if value == val:
                return value
        else:
            return None
    
    
    line_search(li, 56567856)
    
    

    gao

    可以看出线性查找的速度已经0.6秒了,而二分查找依然瞬间出来,固然二分查找的效率是很高的,但是他有一个最大的前提条件就是必须是在已经排好序的列表中,也就是说如果你的需求是在大量数据中查找一次,没必要费劲的做二分查找,因为本身的数据排序所需要的时间是远远要超过列表的线性查找的。
  • 相关阅读:
    Oracle Instant Client(即时客户端) 安装与配置
    面试中经典的数据库问题
    MySQL 大表优化方案
    mysql中Timestamp,Time,Datetime 区别
    HTML学习之给div高度设置百分比不生效的问题
    textarea文本域宽度和高度width及height自动适应实现代码
    JAVA基础----java中E,T,?的区别?
    去除ArrayList集合中的重复自定义对象元素
    sql select中加入常量列
    mysql 将null转代为0
  • 原文地址:https://www.cnblogs.com/lishi-jie/p/9902544.html
Copyright © 2011-2022 走看看