二分查找算法详解:从基础到进阶
创作时间:
作者:
@小白创作中心
二分查找算法详解:从基础到进阶
引用
1
来源
1.
https://www.cnblogs.com/lrc123/p/18093400
二分查找算法是计算机科学中一种非常基础且高效的搜索算法,广泛应用于各种数据结构和算法问题中。本文将从基础到进阶,全面介绍二分查找的各种变体及其应用场景,帮助读者深入理解这一经典算法。
二分查找算法思想
二分查找算法要求待查找的数组必须是有序的。其基本思想是通过不断缩小查找范围来快速定位目标值:
- 定义左右边界索引
l、r,中间索引m=(l+r)/2 - 判断
arr[m]与待查找值target的大小关系:
- 如果
target<arr[m],则证明待查找值在中间索引左侧,减少右边界索引r=m-1 - 如果
target>arr[m],则证明待查找值在中间索引右侧,增加左边界索引l=m+1 - 如果
target=arr[m],则证明找到待查找值,返回对应索引
- 当
l>r时,表示没有找到目标值,返回-1
基础版二分查找代码实现
public static int binarySearch(int [] arr,int target){
int l = 0, r=arr.length-1;
while (l<=r){
int m = (l+r)>>>1;
if(target<arr[m]){
r=m-1;
}else if(arr[m]<target){
l=m+1;
}else {
return m;
}
}
return -1;
}
基础版二分查找性能分析
- 最好情况:O(1),第一次循环的值就是待查找值
- 最坏情况:O(log(n))
平衡版二分查找
在基础版二分查找中,当目标值位于数组左侧时,查找效率较高;而位于右侧时,效率较低。平衡版二分查找通过调整查找策略,使左右两侧的查找效率保持一致:
- 采用左闭右开区间,即左边界索引
l可能是查找目标,而右边界索引r不可能是查找目标 - 在循环外判断最终的
l是否为目标值
平衡版二分查找代码实现
public static int binarySearch2(int [] arr,int target){
int l = 0, r=arr.length;
while (1 <r-l ){
int m = (l+r)>>>1;
if(target<arr[m]){
r=m;
}else {
l=m;
}
}
if(arr[l]==target){
return l;
}else {
return -1;
}
}
最左、右侧匹配的二分查找(LeftRightMost)
在某些场景下,我们可能需要找到所有相同值中的最左侧或最右侧的元素。以下是两种实现方式:
最左侧匹配的二分查找(LeftMost)
public static int binarySearchLeftMost(int [] arr,int target){
int l = 0, r=arr.length-1;
int candidate=-1;
while (l<=r){
int m = (l+r)>>>1;
if(target<arr[m]){
r=m-1;
}else if(arr[m]<target){
l=m+1;
}else {
//找到元素了,不直接返回m,而是记录候选者位置,继续缩小查找范围
candidate = m;
r = m-1;
}
}
return candidate;
}
最左侧匹配的二分查找(LeftMost)-返回特定值
public static int binarySearchLeftMost2(int [] arr,int target){
int l = 0, r=arr.length-1;
while (l<=r){
int m = (l+r)>>>1;
if(target<=arr[m]){
//无论target是否找到还是没找到,都继续缩小范围
r=m-1;
} else {
l=m+1;
}
}
//返回的l是≥target的最左侧索引
return l;
}
最右侧匹配的二分查找(RightMost)
public static int binarySearchRightMost(int [] arr,int target){
int l = 0, r=arr.length-1;
int candidate=-1;
while (l<=r){
int m = (l+r)>>>1;
if(target<arr[m]){
r=m-1;
}else if(arr[m]<target){
l=m+1;
}else {
//找到元素了,不直接返回m,而是记录候选者位置,继续缩小查找范围
candidate = m;
l = m+1;
}
}
return candidate;
}
最右侧匹配的二分查找(RightMost)-返回特定位置
public static int binarySearchRightMost2(int [] arr,int target){
int l = 0, r=arr.length-1;
while (l<=r){
int m = (l+r)>>>1;
if(target<arr[m]){
r=m-1;
}else {
//无论target是否找到还是没找到,都继续缩小范围
l=m+1;
}
}
//返回的l-1是≤target的最右侧索引
return l-1;
}
最左、右侧匹配查找的应用
在实际应用中,最左、右侧匹配查找常用于解决一些特定场景的问题,例如:
- 力扣704题:基本的二分查找问题
- 力扣35题:使用最左侧匹配查找
热门推荐
保障孩子健康过寒假:疾病预防、饮食运动全攻略
从厨房到户外:成大附中“五个一”寒假活动创新家校共育
南京2025小升初:寒假26天,择校讲座1月11日开讲
十二生肖婚恋指南:鼠蛇CP真的绝配?
结节癌变率仅1%-3%,中医调理与饮食改善有妙招
十二生肖中的鼠蛇组合:如何破解“水火不容”的相处之道?
情感共鸣是什么意思啊
2035年建成!北斗系统将实现厘米级定位精度
《摩登时代》:卓别林式的荒诞与现实
卓别林代表作《摩登时代》,表演堪称经典,不愧是喜剧大师
贾樟柯《风流一代》:二十年社会变迁,22天限时礼赞
“小丑文化”的时代变体
河南13城确定寒假时间,中小学最早1月15日放
校长老师支招:让初中生寒假既放松又充实
斯瓦尔巴群岛旅游攻略:北极熊的国度,禁止生小孩与死亡的神奇之地
关于斯瓦尔巴群岛的50个事实
国际法律框架是什么
关于斯瓦尔巴群岛的50个事实
如何在斯瓦尔巴看北极熊
客厅西墙挂牡丹图好吗?探究牡丹图在客厅的悬挂效果与风水讲究
淮安举办世界美食之都美食推介活动,专家建言产业创新发展
游淮安:河下古镇、漕运博物馆等8处必打卡景点
波美度决定蜂蜜品质,教你挑选优质养生蜜
42度是优质蜂蜜门槛,波美度教你辨别真假
远离痛风从饮食开始:8种食物助力尿酸排出
告别高嘌呤:中老年人专属清爽菜谱
高尿酸患者饮食误区:蔬菜豆制品不是禁忌
从KM曲线到Cox模型:肿瘤临床试验统计分析指南
现代科技解密拔罐:最新研究揭示其科学原理
辨体质选拔罐:六种常见体质的调理指南