算法之二分查找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线性查找的更多相关文章
- 数组查找算法的C语言 实现-----线性查找和二分查找
线性查找 Linear Search 用户输入学生学号的成绩 二分查找 Binary Search 要求数据表是已经排好序的 程序存在小的瑕疵
- List<T>线性查找和二分查找BinarySearch效率分析
今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:Bin ...
- 【算法】二分查找法&大O表示法
二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...
- Python 算法之二分查找
二分查找 二分查找又称折半查找 优点是比较次数少,查找速度快,平均性能好 缺点是要求待查表为有序表,且插入删除困难 折半查找方法适用于不经常变动而查找频繁的有序列表. 猜数字游戏 1.生成一个有序列表 ...
- 【PHP数据结构】线性查找与二分查找
欢迎来到查找的世界,在学习完各种数据结构之后,总算走到了这一步,不知道大家有什么感想呢?反正我是边学边忘,现在让我去说说图的那几个算法还是在蒙圈的状态中.不过学习嘛,就是一步一步的来,暂时搞不懂的东西 ...
- C++泛型线性查找算法——find
C++泛型线性查找算法--find <泛型编程和STL>笔记及思考. 线性查找可能是最为简单的一类查找算法了.他所作用的数据结构为一维线性的空间.这篇文章主要介绍使用 C++ 实现泛型算法 ...
- 数据结构与算法之PHP查找算法(二分查找)
二分查找又称折半查找,只对有序的数组有效. 优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...
- java数组回顾---线性查找最大值最小值---二分查找
import java.util.Scanner; public class ArrayDemo { public static void main(String []args) { //------ ...
随机推荐
- scala函数和方法的差别
想知道什么差别,把代码复制下来运行看结果 // 1 1 2 3 5 8 13 def f(x:Int) :Int= { ) ) else f(x-)+f(x-) } println(f()) // v ...
- python [] 数组 list 交集 并集 差集
>>> a = [1,2,3] >>> b = [2,4,5] >>> list(set(a).intersection(set(b))) [2] ...
- 中国大学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 ...
- swfupload文件上传配置文件大小
在配置文件中加入: <system.web> <httpRuntime executionTimeout="36000" maxRequestLe ...
- react-native android 权限问题
初入reactNative 的一个坑 我是用的真机测试,没用安卓模拟器 第一次在安卓上打开应用,提示权限问题: Overlay permissions needs to be granted in o ...
- delphi 控制音量 静音的类
delphi 控制音量 静音的类 unit ttSound; interface uses winapi.windows, winapi.Messages; type SimpleSoundContr ...
- java实现生成二维码
package com.cn.test; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.a ...
- 回溯法 leetcode题解 Combination Sum 递归法
题目大意:给出一个数组,用这些数组里的元素去凑一个target.元素可以重复取用. 感觉对这种题目还是生疏的.脑子里有想法,但是不知道怎么表达出来. 先记录下自己的递归法.应该还可以用循环实现. 回溯 ...
- pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题
综合分析一下行程这个问题的原因: 在终端中运行 select * from django_migrations; 查看 提交的记录,如果你的表删掉了,记录还在,那么数据库会觉得,这个表依然是存在的,所 ...
- mac下shell给文件名批量加前缀
用rename命令 如果没装的话执行下面这个命令安装rename brew install rename rename 's/^/logo_/' *.png