活动地址:优快云21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
欢迎参与优快云学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:
**
创作计划
**
1,机缘
早年就加了群主大大的好友和交流群,那个时候是在刚读大学本科的时候,现在马上也该研二了~~~
2,收获
A,巩固大佬专栏中的基本算法
B,能够让自己写的内容帮助到一部分人
C,认识志同道合的领域同行
…
3,日常
提示:当前创作和你的工作、学习是什么样的关系 例如:
- 偶尔会写博客记录自己学习的内容
- 大部分时间没养成写博客的习惯,希望今后遇到问题解决问题都做记录分享给大家
4,憧憬
提示:不想去互联网公司卷,惜命哈哈哈,希望找个稳定一点的工作,过幸福安稳的生活就好~~
学习计划
1,学习目标
每篇博客使用自己习惯的编程语言实现至少一个算法
2,今日学习内容
A,了解直接插入排序的概念
B,使用编程实现该算法
3,学习时间
周一至周五晚上 7 点—晚上9点
4,学习产出
优快云技术博客 1 篇
学习日记
1.折半查找的概念:
也称二分查找,是一种效率相对较高的查找方法。使用该算法的前提要求是元素已经有序,因为算法的核心思想是尽快的缩小搜索区间,这就需要保证在缩小范围的同时,不能有元素的遗漏。
-
输入
n个数的有序序列,以数组为例,默认升序。
待查找元素key。 -
输出
查找成功:返回元素所在位置的编号。
查找失败:返回-1或自定义失败标识。 -
算法说明
算法的核心思想是不断的缩小搜索的范围,每次取区间的中心来进行比较,会有三种情况发生:
- 与key相等:直接返回对应的位置(对于有重复元素的情况,会在其他子专栏中说明)。
- 比key大:由于元素有序,要查找的元素一定在左侧(如有),于是搜索区间变为左一半。
- 比key小:由于元素有序,要查找的元素一定在右侧(如有),于是搜索区间变为右一半。
于是,只要不断的重复取中间比较和指定新的搜索区间这两个步骤,直到区间的两个端点已经重合(代表搜索完毕)或者找到元素时为止。
- 算法流程
以下图片来自《数据结构简明教程》,查找关键字为7的元素:
2.举例说明

3.代码实现(python):
def binary_search(lst, target):
low = 0
high = len(lst) - 1
while low < high:
mid = (low + high) // 2
if target < lst[mid]:
high = mid - 1
elif target > lst[mid]:
low = mid + 1
else:
return mid
return -1
lst = [10, 11, 12, 14, 20, 32, 34, 35, 41, 43]
target = 35
index = binary_search(lst, target)
print('查找的元素的下标为:' + str(index))
注意:列表中的元素必须保持有序,否则不符合二分查找的要求。
4.算法性能
4.1 时间复杂度
最坏的情况
最坏的情况就是直到最后一次才找到key,或者查找失败的情况。那么也就是说我们只要能计算出最多会找多少次,就能知道最快的情况。
可以知道,寻找的最大次数肯定是与n相关的,由于每次区间都缩小一半。所以这个问题就好比一根绳子,最多被折多少次,直到最后剩下一个元素(不能再折)为止。所以就是一个以2为底,相对于n的对数
O
(
l
o
g
2
n
)
\ O(log _{2} n)
O(log2n)这也就是循环最多会执行的次数(循环内部的代码都是常量级别)。
最好的情况
对于二分查找来说最好的情况就是第一次就找到了key,也就是一脚定乾坤了,此时的时间复杂度为常数级:O(1)。
平均情况
综合两种情况,二分查找的时间复杂度为
O
(
l
o
g
2
n
)
\ O(log _{2} n)
O(log2n)
4.2 空间复杂度
由于算法不会改变原有的元素集合,只需要几个额外的变量记录关键信息,所以空间复杂度为常数级:O(1)。
1507

被折叠的 条评论
为什么被折叠?



