二分查找及有重复值的查找
二分查找
1.二分查找
二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。他的时间复杂度为O(logN)
2.在一组没有重复值的升序数组中查找所求数
//代码及其运行截图
int Binarysearch(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){//如果只是left<right,则会少一次比较int mid = left+((right-left)>>1);//(left+right)/2容易溢出if (*(str + mid) < target){//要找的数在中点的右边left = mid+1;}else if (*(str + mid) > target){//要找的数在中点的左边right = mid-1;}else{return mid;break;}}return -1;
}int main(){int str[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 23, 45 };int size = sizeof(str) / sizeof(str[0]);int x = Binarysearch(str, size, 11);cout << x << endl;
}
这段代码,在没有重复值的升序数组中,运行结果会准确输出,如下运行结果:
!
但是,如果升序数组arr[]={1,2,3,4,4,4,5,5,6,7,8}则输出的结果不会准确,此时我们需要的是出现所找的数的第一个下标或者最后一个下标。
3.在一组有重复值的升序数组中查找所求数
首先我们可以想到,通过二分法拿到一个值,然后再通过这个值向左或向右进行遍历查询,但是此时的时间复杂度为O(logN),因此,我们可以继续通过二分查找法,查找最左或者最右目标值。
查找最左目标值:
//在一组有重复值的升序数组里
int search(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left+((right-left)>>1);if (*(str + mid) >= target) //此时,假设当mid下标所指的值等于我们所查找的值,先不进行返回,此时最高位指向mid且左移一位right = mid - 1;elseleft = mid + 1;if (*(str + right)<target) //此时进行上一个条件中right下标所存的数据与我们target值的比较,如果此时此时的值是小于target,那么mid下标所存的数据则为所求数的最左值,进行输出,否则继续循环return mid;elsecontinue;}return -1;
}
此时我们所求的最左值为3
查找最右目标值:
//在一组有重复值的升序数组里
//查找最右目标值与查找最左目标值的思路相似
int search(int* str,int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left+((right-left)>>1);if (*(str + mid) <= target) left = mid + 1;elseright=mid-1;if (*(str + right)>target) return mid;elsecontinue;}return -1;
}
最终代码及结果:
#include<iostream>
using namespace std;
//二分查找,有重复值的二分查找//在一组有重复值的升序数组里
int right_search(int* str, int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left + ((right - left) >> 1);if (*(str + mid) <= target)left = mid + 1;elseright = mid - 1;if (*(str + right) == target )return right;elsecontinue;}if (left > right)return -1;
}//在一组有重复值的升序数组里
int left_search(int* str, int strlen, int target){int left = 0;int right = strlen - 1;while (left <= right){int mid = left + ((right - left) >> 1);if (*(str + mid) >= target) //此时,假设当mid下标所指的值等于我们所查找的值,先不进行返回,此时最高位指向mid且左移一位right = mid - 1;elseleft = mid + 1;if (*(str + left) == target) //此时进行上一个条件中right下标所存的数据与我们target值的比较,如果此时此时的值是小于target,那么mid下标所存的数据则为所求数的最左值,进行输出,否则继续循环return left;elsecontinue;}if (left > right)return -1;
}int main(){int str[] = { 1, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 8, 9, 10 };int size = sizeof(str) / sizeof(str[0]);cout << "找打5的位置:" << endl;int right_x5 = right_search(str, size, 5);int left_x5 = left_search(str, size, 5);if (left_x5 == right_x5)cout << "可知所求数在此数组里只有一个,且下标为" << right_x5 << endl;else{cout << "他的最左下标值为:" << left_x5 << endl;cout << "他的最右下标值为:" << right_x5 << endl;}cout << "找打2的位置:" << endl;int right_x2 = right_search(str, size, 2);int left_x2 = left_search(str, size, 2);if (left_x2 == right_x2)cout << "可知所求数在此数组里只有一个,且下标为" << right_x2 << endl;else{cout << "他的最左下标值为:" << left_x2 << endl;cout << "他的最右下标值为:" << right_x2 << endl;}
}
运行截图:
以上都是我个人所思所得,如果有错误,欢迎在评论区指正。
二分查找及有重复值的查找相关推荐
- 怎么在EXCEL里查找是否有重复值,福利在这里,EXCEL里如何查找是否存在重复值
在录入EXCEL表格时,如果数据过多,会出现重复录入的数据,也就是重复值.如何查看EXCEL表格里是否存在重复值以及把这些重复值查找出来呢?今天小编教给大家一个小技巧: 第一步.新建一个EXCEL 第 ...
- excel查找定位删除0值_查找和删除Excel行的快速方法
excel查找定位删除0值 It's finally summer, and you need to stay cool, even when you're using Excel. Here's a ...
- hashmap的键查找遍历与键值对查找遍历
键找值方式:即通过元素中的键,获取键所对应的值 操作步骤: 1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键 2.遍历键的Set集合,得到每一个键 3.根据键,获取键所 ...
- oracle查找clob中的值,Oracle 查找带有CLOB字段的所有表
myBatis的一对多查询,主要利用resultMap实现一次查询多个结果集 日常开发中有这中场景,一个用户有多个角色,一个角色又有多个菜单,想查出一个用户的所有菜单.除了常见的关联查询之外,更使用的 ...
- datacombo重复值的处理_Pandas入门【S1E3】缺失值和重复值处理
导语: 前两期分别就pandas安装和导入数据.pandas数据探索做了梳理. 回顾如下: Pandas安装和数据导入mp.weixin.qq.com Pandas数据探索mp.weixin.qq ...
- Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
Java有序表查找:折半查找.二分查找.差值查找和斐波那契查找 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51 ...
- 有序数组二分查找最接近的值
有序数组二分查找最接近的值 问题 思路 代码 循环的终止条件 如何改为求upper_bound 问题 给你一个有序数组,数组里面有正有负,有重复值,再给你扔一个target 数,求这个数组中最接近ta ...
- elasticsearch 根据条件去除重复值_Excel工作表中的条件格式,不只是查找重复值,还有7种典型用法...
Excel工作表中的[条件格式],对于大部分亲来说并不陌生,用的最多的应该是标识"重复值"或"唯一值",其实还有数据可视化等多种功能-- 一.Excel条件格式 ...
- 1.11 编程基础之二分查找 08 不重复地输出数 python
http://noi.openjudge.cn/ch0111/08/ """ 1.11 编程基础之二分查找 08 不重复地输出数 http://noi.openjudge ...
最新文章
- R可视化多元线性回归模型
- Angular的built-in指令
- monolith_将Java EE Monolith雕刻成微服务
- Java基本数据类型总结(转)
- Broadcast receiver之我见
- C++ 鼠标乱动整人代码
- Lifo管理系统(转载)
- 转载C# -- 系统托盘NotifyIcon控件
- 计算机限制360打不开,电脑360浏览器打不开解决方法
- 【软件测试】学习路线资料整理摆脱迷茫,突破瓶颈(送给我迷茫的朋友)
- 安卓跳转应用市场评论
- 阿尔茨海默最新研究进展(2022年12月)
- 浅谈雷达在气象领域的基本应用
- PicGo+Typora图床搭建教程
- 第三个Sprint ------第十一天
- 迪文串口屏使用注意事项
- 如何优雅的抄袭代码?天下代码一大抄,这才是正确的姿势
- 浙大高分子物理郑强教授
- 【Demo见真章】基于HarmonyOS手机实现五子棋对战小游戏
- [C++实现 设计模式(6)] : 代理模式
热门文章
- 7-6 寻找大富翁 (25分)
- Spring idea中spring配置文件自动检查配置应用程序上下文的操作
- Day118.尚医通:订单列表、详情、微信支付、查询交易状态
- 淘宝,天猫获得商品评论 API
- python中画出距平垂线_3.机器学习—数据科学包3.3pandas操作
- [深度学习]实现一个博弈型的AI,从五子棋开始
- ShadowDiffusion: When Degradation Prior Meets Diffusion Model for Shadow Removal (Paper reading)
- 小米7.0系统如何无Root激活Xposed框架的教程
- 某程序员哀叹:辛辛苦苦写几年代码,做了些业务,有了点成就感,但回头一看80%都没用,没法写到简历上!...
- 【anyRTC-RTMP-OpenSource】2.0 windows构建