基本算法——二分查找


活动地址:优快云21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…


欢迎参与优快云学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程。您可以从以下3个方面任选其一着手(不强制),或者按照自己的理解发布专栏学习作品,参考如下:

**

创作计划

**
1,机缘

早年就加了群主大大的好友和交流群,那个时候是在刚读大学本科的时候,现在马上也该研二了~~~

2,收获

A,巩固大佬专栏中的基本算法
B,能够让自己写的内容帮助到一部分人
C,认识志同道合的领域同行

3,日常

提示:当前创作和你的工作、学习是什么样的关系 例如:

  1. 偶尔会写博客记录自己学习的内容
  2. 大部分时间没养成写博客的习惯,希望今后遇到问题解决问题都做记录分享给大家

4,憧憬

提示:不想去互联网公司卷,惜命哈哈哈,希望找个稳定一点的工作,过幸福安稳的生活就好~~

学习计划

1,学习目标

每篇博客使用自己习惯的编程语言实现至少一个算法

2,今日学习内容

A,了解直接插入排序的概念
B,使用编程实现该算法

3,学习时间

周一至周五晚上 7 点—晚上9点

4,学习产出

优快云技术博客 1 篇

学习日记

1.折半查找的概念:

也称二分查找,是一种效率相对较高的查找方法。使用该算法的前提要求是元素已经有序,因为算法的核心思想是尽快的缩小搜索区间,这就需要保证在缩小范围的同时,不能有元素的遗漏。

  • 输入
    n个数的有序序列,以数组为例,默认升序。
    待查找元素key。

  • 输出
    查找成功:返回元素所在位置的编号。
    查找失败:返回-1或自定义失败标识。

  • 算法说明
    算法的核心思想是不断的缩小搜索的范围,每次取区间的中心来进行比较,会有三种情况发生:

  1. 与key相等:直接返回对应的位置(对于有重复元素的情况,会在其他子专栏中说明)。
  2. 比key大:由于元素有序,要查找的元素一定在左侧(如有),于是搜索区间变为左一半。
  3. 比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)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值