码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【算法】折半查找


    ​折半查找
    ​猜数字大小

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

    目录

    1.折半查找

    1.1 定义​

    1.2 说明

    1.3 代码示例

    1.4 复杂度

    1.5 优缺点

    2.猜数字大小

    2.1 说明

    2.2 解法

    2.3 复杂度


    1.折半查找

    1.1 定义​

    折半搜索,也称二分搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。

    1.2 说明

    搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

    1.3 代码示例

    1)首先确定整个查找区间的中间位置 mid = (left + right)/2 。

    2)用待查关键字值与中间位置的关键字值进行比较;若相等,则查找成功;若大于,则在后(右)半个区域继续进行折半查找;若小于,则在前(左)半个区域继续进行折半查找。

    3)对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。折半查找的存储结构采用一维数组存放

    1. public int search(int[] nums, int target) {
    2. int left = 0;
    3. int right = nums.length-1;
    4. while(left <= right){
    5. int mid = left + (right-left)/2;
    6. if (nums[mid] == target) {
    7. return mid;
    8. }else if(nums[mid] > target) {
    9. right = mid - 1;
    10. }else{
    11. left = mid + 1;
    12. }
    13. }
    14. return -1;
    15. }

    1.4 复杂度

    时间复杂度:O(log N)

    空间复杂度:O(1)

    1.5 优缺点

    优点:

    比较次数少,查找速度快,平均性能好

    缺点:

    待查表为有序表,且插入删除困难,

    边界范围容易搞混,终止条件的确定

    经常变动而查找频繁的有序列表

    2.猜数字大小

    2.1 说明

    • 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
    • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
    • -1:我选出的数字比你猜的数字小 pick < num
    • 1:我选出的数字比你猜的数字大 pick > num
    • 0:我选出的数字和你猜的数字一样。恭喜!你猜对了

    2.2 解法

     记选出的数字为 pick,猜测的数字 为 num。若gess(x) <= 0 ,说明  pick <= num,否则 pick >= num

    使用二分查找来求出答案pick

    通过while 循环 来直到区间左右端点相同就退出循环

    使用 mid = left + (right - left) / 2 而不使用  (right - left) / 2 , 是为了防止计算时溢出

    通过 guess(mid) <= 0 来知道要找的数字在 [left , mid ] 区间

    否则在 [mid  + 1, right] 区间

    最终 端点 left == right 时,区间缩为一个点,就是要找的数字

    1. public int guessNumber(int n) {
    2. int left = 1, right = n;
    3. while (left < right) {
    4. int mid = left + (right - left) /2;
    5. if (guess(mid) <= 0) {
    6. right = mid;
    7. } else {
    8. left = mid + 1;
    9. }
    10. }
    11. return left;
    12. }

    2.3 复杂度

    时间复杂度:

    O(logn)。时间复杂度即为二分的次数,每次二分我们将区间的长度减小一半,直至区间长度为 1 时二分终止,而区间初始长度为 nn,因此二分次数为 O(logn)。

    空间复杂度:O(1)。

  • 相关阅读:
    【0147】当参数shared_memory_type分别为sysv和mmap时,差异为何如此大?
    密码学三 btc 钱包 节点 挖矿 51%攻击 双花攻击
    spring cloud新版本使用loadbalancer替代Ribbon
    Handle
    C++的extern关键字在HotSpot VM中的重要应用
    Idea+maven+spring-cloud项目搭建系列--8整合Zookeeper
    汇编语言程序设计·RB(AT&T汇编)_笔记_第6章:控制执行流程
    Android已有应用生成aar 并集成到其他应用内部(本地AAR)
    这才是 SpringBoot 统一登录鉴权、异常处理、数据格式的正确打开姿势
    自然语言处理文本分割[Text segmentation]:PoNet算法使用多粒度Pooling结构替代attention的网络
  • 原文地址:https://blog.csdn.net/m0_60494863/article/details/126273431
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号