Day 1 - 二分

1|0整数二分

我们可以做到每次排除一半的答案,时间复杂度 O(logn)

long long l = L, r = R; while(l <= r) { long long mid = (l + r) >> 1; if(mid > x) r = mid - 1; else l = mid + 1; } long long ans = l;

2|0实数二分

我们规定一个精度 eps,以此达到整数二分的效果,时间复杂度为 O(logRLeps)

为了防止精度过度导致死循环,我们可以限制二分次数,如限制为 100 次。

实际应用

  1. 实现求解连续函数的零点(近似解)。

  2. 0/1 分数规划。

  3. 最小比值生成树。

3|0三分法

三分法衍生自二分法,三分法求单峰函数的峰值。

3|1算法流程

设当前搜索域为 [l,r],取该区间的三等分点 lmid,rmid

若满足 f(lmid)<f(rmid),则可以排除 [l,lmid]

若满足 f(lmid)=f(rmid),则可以排除 [l,lmid][rmid,r]

若满足 f(lmid)>f(rmid),则可以排除 [rmid,r]

3|2实数三分

double l = L, r = R; for(int i = 1; i <= 100; i ++) { double lmid = l + (r - l) / 3, rmid = r - (r - l) / 3; if(f(lmid) < f(rmid)) l = lmid; else r = rmid; } double ans = f(l);

3|3整数三分

long long l = L, r = R; while(r - l > 3) { long long lmid = l + (r - l) / 3, rmid = r - (r - l) / 3; if(f(lmid) < f(rmid)) l = lmid; else r = rmid; } long long ans = f(l); for(int i = l + 1; i <= r; i ++) ans = max(ans, f(i));

3|4算法优化

考虑计算时间复杂度,由于每次搜索域缩减到 23

因此时间复杂度为 O(log32RLeps)

我们完全可以将 lmidrmid 不断接近,以此达到使 log 的底数无限接近 2

3|5应用场景

在单峰性/单谷性能够证明的题目中,三分法都能高效地适配。


__EOF__

本文作者So_noSlack
本文链接https://www.cnblogs.com/So-noSlack/p/18289729.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   So_noSlack  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示