• 算法之二分查找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秒了,而二分查找依然瞬间出来,固然二分查找的效率是很高的,但是他有一个最大的前提条件就是必须是在已经排好序的列表中,也就是说如果你的需求是在大量数据中查找一次,没必要费劲的做二分查找,因为本身的数据排序所需要的时间是远远要超过列表的线性查找的。
  • 相关阅读:
    OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..
    Python中*args和**kwargs的区别
    命令行运行Python脚本时传入参数的三种方式
    关于 initWithNibName 和 loadNibNamed 的区别和联系-iPhone成长之路
    NSBundle介绍
    UIView总结
    iPhone How-to:如何调整UIView的Z-Order
    有关View的几个基础知识点-IOS开发
    NSNumber与NSInteger的区别
    iOS第三方开源库的吐槽和备忘
  • 原文地址:https://www.cnblogs.com/lishi-jie/p/9902544.html
Copyright © 2020-2023  润新知