二分和三分
二分查找
二分的精度问题,一般用double解决,eps=1e-8,关于l,r的取值看那个区间有没有可能取到,然后-1或者+1,会不会使得值变化得特别大,如果会变化得特别大,那么就l,r都取mid
O(log n)
//查找一个数
int b_Search(int x)
{
int l,r,mid;
l=1,r=n;
while(l<=r){
mid=(l+r)>>1;
if(a[mid]>k) r=mid-1;
else if(a[mid]<k) l=mid+1;
else return a[mid];
}
return -1;
}
//查找左边界
int Left_b_Search(int x)
{
int l,r,mid;
l=0,r=n;
while(l<r){
mid=(l+r)>>1;
if(a[mid]>=x) r=mid;
else l=mid+1;
}
if(l==n+1) return -1;
else return a[l];
}
//查找右边界
int Right_b_Search(int x)
{
int l,r,mid;
l=0,r=n;
while(l<r){
mid=(l+r+1)>>1;
if(a[mid]<=x) l=mid;
else r=mid-1;
}
if(r==0) return -1;
else return a[r];
}
//关于lower_bound && upper_bound
类似于二分查找 时间复杂度log
在升序序列中
1. lower_bound(begin,end,k)
返回的是第一个大于等于k的数的地址
如果要返回下标:lower_bound(a,a+n,k)-a
2. upper_bound(begin,end,k)
返回的是第一个大于k的数的地址
如果要返回下标:upper_bound(a,a+n,k)-a
在降序序列中
1. lower_bound(begin,end,k,greater<type>())
返回的是第一个小于等于k的数的地址
如果要返回下标:lower_bound(a,a+n,k,greater<int>())-a
2. upper_bound(begin,end,k,greater<type>())
返回的是第一个小于k的数的地址
如果要返回下标:upper_bound(a,a+n,k,greater<int>())-a
三分
单峰函数要满足严格的单调性,如果函数中存在一段值相等的部分,那么三分法就不再适合
const double epx=1e-15;
double T_search(double l,double r)
{
double lmid,rmid;
while(r-l>=epx){
lmid=(l+r)/2.0, rmid=(r+lmid)/2.0;
if(F(lmid)<F(rmid)) l=lmid;
else r=rmid;
}
return r;
}
向wjmzbmr学习,acm本就是逆天而行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效