• 算法之二分查找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秒了,而二分查找依然瞬间出来,固然二分查找的效率是很高的,但是他有一个最大的前提条件就是必须是在已经排好序的列表中,也就是说如果你的需求是在大量数据中查找一次,没必要费劲的做二分查找,因为本身的数据排序所需要的时间是远远要超过列表的线性查找的。
  • 相关阅读:
    用正则表达式简单加密(C#为例)
    新浪微博error:redirect_uri_mismatch的解决方法 [
    UITableView延伸:点击cell关闭键盘,加载不同cell,监听里面的textfeild内容改变
    iossharesdk微信登录出错
    关于IOS项目QQ空间授权提示安装最新版本的QQ的解决方法!
    如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2'
    UITableView加载几种不同的cell
    iOS学习小结(一)
    开源中国+soucetree
    获取本机ip地址
  • 原文地址:https://www.cnblogs.com/lishi-jie/p/9902544.html
Copyright © 2020-2023  润新知