聊一聊二分查找的实现
二分查找其实原理很简单,基于排序的数组每次找中间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留在这里了,撒花。
聊一聊二分查找的实现相关推荐
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- 二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...
- python数据结构与算法:二分查找
二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...
- 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...
- 二分查找的循环实现和递归实现
自己实现了二分查找的循环实现和递归实现 说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法.虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算. 要求传入的表是 ...
最新文章
- 爬虫与浏览器的区别,爬虫产生(出自简书)
- Vim 删除不包含指定字符串的行及统计匹配个数
- 2017.5.5-afternoon
- word2vec原理_深入理解Word2Vec底层原理
- 为pc编译配置安装当前最新的内核
- top 命令_Linux监控cpu以及内存使用情况之top命令
- 怕被政治烧到,RISC-V基金会决定迁址瑞士
- Codeforces Round 493
- http.client.ResponseNotReady: Request-sent
- docker 不包含依赖 打包_docker源码打包RPM
- 6.6 AdaBoost实战
- tomcat 启动报错 解决办法 A child container failed duringnbsp
- win7文件扩展名被隐藏无法修改文件格式怎么办?
- 弹出启动windows安全中心服务器,Win10每次开机都弹出启用Windows安全中心服务怎么办?...
- 计算机图像处理之空域滤波增强(彩色增强)
- python正态分布拟合_用python拟合正态分布(已开源)
- 【Android安全】Soot 静态分析教程
- fk算法绘制层状介质理论地震图
- 直流有刷电机控制原理及工程问题记录
- Django Vue渲染动态数据(七)