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

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

时间: 2024-10-07 15:33:44

算法之二分查找PK线性查找的相关文章

查找与排序01,线性查找,时间复杂度,算法

线性查找,肯定是以线性的方式,在集合或数组中查找某个元素.本篇包括: 通过代码来理解线性查找 时间复杂度 什么是算法 通过代码来理解线性查找 什么叫"线性"?还是在代码中体会吧. 首先需要一个集合或数组,如何得到呢?就生成一个固定长度的随机数组吧.然后输入一个查找key,如果找到就返回元素的索引,没找到就返回-1,就这么简单. class Program { private static int[] arr; private static Random r = new Random()

Java小练习 数组的复制,反转及查找(线性,二分)

/* 算法: 数组的复制,反转,查找(线性查找,二分查找) */ import java.util.Scanner; public class arrayCopyReverseSearch { public static void main(String[] args) { String[] arr = new String[]{"AA", "BB", "CC", "DD", "EE", "FF&

List&lt;T&gt;线性查找和二分查找BinarySearch效率分析

今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:BinarySearch,因为二分查找必须是对有序数组才有效,所以查找前要调用List的Sort方法. 结论:如果List项的个数比较小,用线性查找要略快于二分查找,项的个数越多二分算法优势越明显.可根据实际情况选用适合的查找方式. 测试结果: 测试代码: private void button1_Cli

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

python几种排序算法和二分查找方法的实现

一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想. 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = the

基础算法介绍 —— 二分查找算法

不知不觉在目前的公司待满3年了,打算回家找份工作.面试中被问到关于算法的题目:有哪些常见的查找算法?下来就把我所掌握的查找算法分享给大家,本文主要介绍二分查找算法. 算法定义(摘自百度):二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果

算法之二分查找

最近没有管理好自己的情绪,哎... 上班之余,研究一下算法也不错,本人比较喜欢数学,只要被让我被英文单词怎么都好,哈哈,研究算法算是本人的小爱好吧,做好每天从头开始的准备,从头开始,今天就从二分查找开始. 二分查找又称折半查找,查找的速度比较快,次数比较少,性能比较好,但是二分查找一般是对已经排过序的进行查找,相对来说插入和删除比较不好操作.今天就以一个小的例子来研究一下二分查找 已知数组data={12,14,18,23,26,27,33,45,66,78,98},使用二分法查找98所在的位置

排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)

四种排序算法 1.冒泡排序 思路分析:从前往后相邻的两个数一次进行比较,大的往下沉,小的网上 冒.当相邻的两个数的比较后发现他们的排序与排序要求相反,就互换. 代码实现 $arr = array (1,42,33,69,7,82,34,54,70,99); $len = count($arr); For($i=1;$i<$len;$i++){ For($j=0;$j<$len-$i;$j++){ If($arr[$j] > $arr[$j+1]){ $tmp = $arr[$j+1];

查找算法:二分查找、顺序查找

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找. 查找算法通常需要两个输入: 1.被查找的序列 2.要查找的关键词 查找算法的输出参数和返回值: 1.返回类型为 Error_co