二分查找和二分答案

★二分查找:
1.二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序结构,而且表中元素按关键字有序排列。
2.二分查找时间复杂度:
因为二分查找每次排除掉一半的不合适值,所以对于n个元素的情况:
一次二分剩下:n/2;
两次二分剩下:n/4;
……
m次二分剩下:n/(2^m);
在最坏的情况下是再排除到最后一个值之后得到结果,即
n/(2^m)=1;
所以由上式可得:2^m=n
进而可求出时间复杂度为:log2(n)
3.3种常用二分查找代码
int l=1,r=n,mid;
while(l<=r){
mid=l+(r-l)/2;
①if(x<a[mid]) r=mid-1;
else if(x>a[mid]) l=mid+1;
else{
cout<<mid;
return 0;
}
②if(x<=a[mid]) r=mid-1;
else l=mid+1;
③if(x>=a[mid]) l=mid+1;
else r=mid-1;
}
①cout<<-1;//找x在a数组中的下标(※注意:a数组元素不重复)
②if(a[l]x) cout<<l;//找x在a数组中第一次出现的下标
③if(a[l-1]
x) cout<<l-1;//找x在a数组中最后一次出现的下标
else cout<<-1;
4.mid的3种写法:
(1)mid=(l+r)/2
(2)mid=l+r>>1
(3)mid=l+(r-l)/2(※注意:可以防止l+r越界的情况)
★二分函数:
1.binary_search(): 二分查找函数:
使用:binary search(a+begin,a+end,x,cmp);
意义:在a数组的下标为(begin,end)区间内,按照cmp的排序规则,找元素x,找到返回 true, 找不到返回 false。(※注意:不包含结束位置)
2.lower_bound(): 二分查找左边界:
使用:lower_bound(a+begin,a+end,x,cmp);
意义:在a数组的下标为[begin,end] 区间内,按照cmp的排序规则,找元素x的左边界第一个大于等于元素的x的位置,返回位置指针;(※注意:要位置就用指针减a,找不到指向下标为end的元素位置)
2.upper_bound(): 二分查找左边界:
使用:upper_bound(a+begin,a+end,x,cmp);
意义:在a数组的下标为[begin,end] 区间内,按照cmp的排序规则,找元素x的左边界第一个大于元素的x的位置,返回位置指针;(※注意:要位置就用指针减a,找不到指向下标为end的元素位置)
★二分答案:
1.二分答案与二分查找类似,也就是对有着单调性的答案进行二分,用于求解满足某种条件下的最大(小)值。
2.常用模板:
int l=1,r=n,mid;
while(l<=r)
mid=l+(r-l)/2;
if(check(mid))r=mid-1;
else l=mid+1;
}(※注意:check函数根据题意来写,判断mid是否满足条件)

posted @   ljy15602480308  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示