二分查找算法
点击蓝字“莫名Coder”关注我哟
加个“星标★”,每日良时,好文必达!
文章图片
算法与数据结构
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
时间复杂度 时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。时间复杂度常用大O符号表述
空间复杂度 【二分查找算法】空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记作S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。
用户登录问题
数据库存放了所有用户的登录账号和密码,假如我们登录淘宝,用户ID为:taobao
- 方法一:对数据中的每个数据进行匹配找到结果是否一致
- 方法二:预先对数据库中所有的数据按照字母排序,接着从数据可能中间开始查找,通过二分查找算法不断缩小范围
什么是对数? 你可能就不知道什么是对数,但是记得什么是幂。log10 100 相当于问:"将多少的10相乘的结果是100"。答案是两个,因此:log10 100 = 2
二分查找算法 学习二分查找算法之前,我们需要知道数组,python语言中就是列表。即数组中,假设从0开始编号,第一个元素位置为#0,第二个则是#1,依次类推。
例如:
文章图片
上图就是我们需要查找的数组部分,那么就可以知道low的起始值为0,high则为数组的长度减去1。
low = 0
high = len(list) - 1
每次需要猜取中间的元素。
mid = (low + high) // 2 # 如果mid不是一个偶数,我们采用向下取整
guess = list[mid]
如果猜的数字小了,就相应修改low的值,如果猜的数字大了,就修改high的值,完整的代码如下:
def find_search(list, item):
# list传入的数组或者列表
# item则是传入查找列表的部分元素
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high) // 2
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1return Nonemy_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]print(find_search(my_list, 2))
运行时间 二分查找中,我们简单查了9个数据,并没有发现快多少。如果是一个几百万的数据,不使用算法要猜几百万次。换而言之,猜的次数和列表长度一致,这就是线性时间。
- O(log n) 对数时间,这种算法包括了二分查找
- O(n) 线性时间,简单查找
- O(n * log n) 快速排序,一种速度较快的算法
- O(n2) 选择排序
- O(n!) 一种非常慢的算法,具体可以参考旅行商案例
- 二分查找的速度比简单查找速度快得多
- 算法的运行时间不是以秒做单位,是从其增速的角度度量的
- 算法的运行时间用大O表示
文章图片
文章图片
你点的每个在看,我都认真当成了喜欢
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 《算法》-图[有向图]
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解
- 《数据结构与算法之美》——队列
- 算法回顾(SVD在协同过滤推荐系统中的应用)
- 超好用的PubMed文献查找管理插件—Scholarscope