列表查找(线性查找)

本质就是列表的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线性查找的更多相关文章

  1. 数组查找算法的C语言 实现-----线性查找和二分查找

    线性查找  Linear Search 用户输入学生学号的成绩 二分查找  Binary Search 要求数据表是已经排好序的 程序存在小的瑕疵

  2. List<T>线性查找和二分查找BinarySearch效率分析

    今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:Bin ...

  3. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  4. Python 算法之二分查找

    二分查找 二分查找又称折半查找 优点是比较次数少,查找速度快,平均性能好 缺点是要求待查表为有序表,且插入删除困难 折半查找方法适用于不经常变动而查找频繁的有序列表. 猜数字游戏 1.生成一个有序列表 ...

  5. 【PHP数据结构】线性查找与二分查找

    欢迎来到查找的世界,在学习完各种数据结构之后,总算走到了这一步,不知道大家有什么感想呢?反正我是边学边忘,现在让我去说说图的那几个算法还是在蒙圈的状态中.不过学习嘛,就是一步一步的来,暂时搞不懂的东西 ...

  6. C++泛型线性查找算法——find

    C++泛型线性查找算法--find <泛型编程和STL>笔记及思考. 线性查找可能是最为简单的一类查找算法了.他所作用的数据结构为一维线性的空间.这篇文章主要介绍使用 C++ 实现泛型算法 ...

  7. 数据结构与算法之PHP查找算法(二分查找)

    二分查找又称折半查找,只对有序的数组有效. 优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序 ...

  8. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...

  9. java数组回顾---线性查找最大值最小值---二分查找

    import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...

随机推荐

  1. scala函数和方法的差别

    想知道什么差别,把代码复制下来运行看结果 // 1 1 2 3 5 8 13 def f(x:Int) :Int= { ) ) else f(x-)+f(x-) } println(f()) // v ...

  2. python [] 数组 list 交集 并集 差集

    >>> a = [1,2,3] >>> b = [2,4,5] >>> list(set(a).intersection(set(b))) [2] ...

  3. 中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageIndex=1

    中国大学mooc直播回放看这里哦http://www.icourse163.org/forum/1001974001/topic-1003372881.htm?sortType=1&pageI ...

  4. swfupload文件上传配置文件大小

    在配置文件中加入: <system.web>         <httpRuntime executionTimeout="36000" maxRequestLe ...

  5. react-native android 权限问题

    初入reactNative 的一个坑 我是用的真机测试,没用安卓模拟器 第一次在安卓上打开应用,提示权限问题: Overlay permissions needs to be granted in o ...

  6. delphi 控制音量 静音的类

    delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...

  7. java实现生成二维码

    package com.cn.test; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.a ...

  8. 回溯法 leetcode题解 Combination Sum 递归法

    题目大意:给出一个数组,用这些数组里的元素去凑一个target.元素可以重复取用. 感觉对这种题目还是生疏的.脑子里有想法,但是不知道怎么表达出来. 先记录下自己的递归法.应该还可以用循环实现. 回溯 ...

  9. pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题

    综合分析一下行程这个问题的原因: 在终端中运行 select * from django_migrations; 查看 提交的记录,如果你的表删掉了,记录还在,那么数据库会觉得,这个表依然是存在的,所 ...

  10. mac下shell给文件名批量加前缀

    用rename命令 如果没装的话执行下面这个命令安装rename brew install rename rename 's/^/logo_/' *.png