二分查找其实原理很简单,基于排序的数组每次找中间index的值与目标值做比较,达到快速查找的目的。因此带有二分策略的算法,复杂度都是log(n)级别的。

与hash的对比

hash查找通常是常量级别的,优势是比二分查找更快,但是由于缺乏排序查找的功能,因此在基于范围的查找,或者有条件的模糊查找方面是很无能为力的。比如比<=val的最大的数,>=val最小的数,第一个==val的数,最后一个等于val的数。

实现

  • 首先看一看基本的二分查找等于实现,这一段代码其实并没有什么好说的,哪里都能看到

    int FindEqual(int a[], int left, int right, int val)
    {while (left <= right){int mid = (left + right) / 2;if (a[mid] == val){return mid;}else if (a[mid] < val){left = mid + 1;}else{right = mid - 1;}}return -1;
    }
  • 有条件的二分查找,找<=val的值,那么要注意如下几点:

    • 最大的符合条件的,那么最终应当返回left,因为left能不断向右走,逼近结果
    • 确保left是当前最右的符合条件的答案,right之后都不是答案,right可能是答案
    • left每次只能赋值为mid,不能是mid+1,因为mid可能就是答案,而mid+1就把答案越过去了,除非添加额外逻辑才能找回
    • 要确保mid每次都不同,那么必须mid向上取整,否则会陷入mid相等的死循环

    代码如下

    int FindUpper(int a[], int left, int right, int val)
    {while (left < right){int mid = (left + right + 1) >> 1; // 确保mid不会死循环if (a[mid] <= val){left = mid;}else{right = mid - 1;}}return left;
    }

    同理查找>=val的值,与之类似

    // >= val
    int FindLower(int a[], int left, int right, int val)
    {while (left < right){int mid = (left + right) >> 1;if (a[mid] >= val){right = mid;}else{left = mid + 1;}}return right;
    }

如果想要查找等于,那么返回right之前比较一下right下表是否等于val,不等于就是-1了。

第一次写博客,FB留在这里了,撒花。

聊一聊二分查找的实现相关推荐

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. LeetCode简单题之二分查找

    题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...

  3. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  4. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  5. 二分查找算法的一点改进

    在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...

  6. 二分法:二分查找(递归+非递归)实现

    二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...

  7. python数据结构与算法:二分查找

    二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...

  8. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

  9. 二分查找的循环实现和递归实现

    自己实现了二分查找的循环实现和递归实现 说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法.虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算.     要求传入的表是 ...

最新文章

  1. 爬虫与浏览器的区别,爬虫产生(出自简书)
  2. Vim 删除不包含指定字符串的行及统计匹配个数
  3. 2017.5.5-afternoon
  4. word2vec原理_深入理解Word2Vec底层原理
  5. 为pc编译配置安装当前最新的内核
  6. top 命令_Linux监控cpu以及内存使用情况之top命令
  7. 怕被政治烧到,RISC-V基金会决定迁址瑞士
  8. Codeforces Round 493
  9. http.client.ResponseNotReady: Request-sent
  10. docker 不包含依赖 打包_docker源码打包RPM
  11. 6.6 AdaBoost实战
  12. tomcat 启动报错 解决办法 A child container failed duringnbsp
  13. win7文件扩展名被隐藏无法修改文件格式怎么办?
  14. 弹出启动windows安全中心服务器,Win10每次开机都弹出启用Windows安全中心服务怎么办?...
  15. 计算机图像处理之空域滤波增强(彩色增强)
  16. python正态分布拟合_用python拟合正态分布(已开源)
  17. 【Android安全】Soot 静态分析教程
  18. fk算法绘制层状介质理论地震图
  19. 直流有刷电机控制原理及工程问题记录
  20. Django Vue渲染动态数据(七)

热门文章

  1. app崩溃的原因 和 提前测试流程/方法 和出现崩溃后怎么定位和处理 总结(持续更新中)
  2. 计算机设计大赛心得总结-软件开发组
  3. 土法合并GridView表头
  4. Python十大经典语法合集
  5. linux端口详解大全
  6. Windows Sockets网络编程(5)完成端口模型(IOCP)
  7. VIVE Focus 3 驱动问题
  8. 机器学习:性能度量篇-Python利用鸢尾花数据绘制ROC和AUC曲线
  9. 多用户商城系统小程序怎么做直播卖货
  10. 汉堡王什么汉堡好吃_汉堡王什么汉堡好吃?汉堡王哪个汉堡最好吃