码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-11-04 00:25:26      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:else   imp   binary   *args   技术分享   结束   run   有序   arch   

列表查找(线性查找)

本质就是列表的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线性查找

标签:else   imp   binary   *args   技术分享   结束   run   有序   arch   

原文地址:https://www.cnblogs.com/lishi-jie/p/9902544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!