算法之二分查找PK线性查找

Posted lishi-jie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之二分查找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)

技术分享图片

可以看出线性查找的速度已经0.6秒了,而二分查找依然瞬间出来,固然二分查找的效率是很高的,但是他有一个最大的前提条件就是必须是在已经排好序的列表中,也就是说如果你的需求是在大量数据中查找一次,没必要费劲的做二分查找,因为本身的数据排序所需要的时间是远远要超过列表的线性查找的。

以上是关于算法之二分查找PK线性查找的主要内容,如果未能解决你的问题,请参考以下文章

二分查找之算法

数据结构与算法之-二分查找

快看那个运维妹子在学算法二分查找

Day568.线性查找&二分查找 -数据结构和算法Java

学习数据结构笔记 ---查找算法(线性查找,二分查找,插值查找,斐波那契查找)

Go 实现线性查找算法和二分查找算法