• 基本算法——二分查找



    活动地址:CSDN21天学习挑战赛

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


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

    **

    创作计划

    **
    1,机缘

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

    2,收获

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

    3,日常

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

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

    4,憧憬

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

    学习计划

    1,学习目标

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

    2,今日学习内容

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

    3,学习时间

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

    4,学习产出

    CSDN技术博客 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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    注意:列表中的元素必须保持有序,否则不符合二分查找的要求。

    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)。

  • 相关阅读:
    状态管理的艺术:探索Flutter的Provider库
    图解LeetCode——640. 求解方程(难度:中等)
    自定义映射resultMap
    79. 单词搜索
    四川古力未来科技抖音小店打造品质生活,可靠之选引领潮流
    【opencv】【CPU】windows10下opencv4.8.0-cuda C++版本源码编译教程
    Uniapp导出的iOS应用上架详解
    Go语言知识查漏补缺|基本数据类型
    15 万奖金!开放原子开源大赛OpenAnolis 赛题@你报名
    线性代数笔记
  • 原文地址:https://blog.csdn.net/Limenrence/article/details/126264046