二分和三分

二分和三分

二分查找

二分的精度问题,一般用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;
}



posted @   fengzlj  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示