整数二分

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

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;

实数二分

我们规定一个精度 \(eps\),以此达到整数二分的效果,时间复杂度为 \(O(\log \frac{R-L}{eps})\)。

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

实际应用

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

  2. \(0/1\) 分数规划。

  3. 最小比值生成树。

三分法

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

算法流程

设当前搜索域为 \([l,r]\),取该区间的三等分点 \(\text{lmid,rmid}\)。

若满足 \(f(\text{lmid})<f(\text{rmid})\),则可以排除 \([l,\text{lmid}]\)。

若满足 \(f(\text{lmid})=f(\text{rmid})\),则可以排除 \([l,\text{lmid}] \cup [\text{rmid},r]\)。

若满足 \(f(\text{lmid})>f(\text{rmid})\),则可以排除 \([\text{rmid},r]\)。

实数三分

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);

整数三分

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));

算法优化

考虑计算时间复杂度,由于每次搜索域缩减到 \(\frac{2}{3}\)。

因此时间复杂度为 \(O(\log_{\frac{3}{2}} \frac{R - L}{eps})\)。

我们完全可以将 \(\text{lmid}\) 和 \(\text{rmid}\) 不断接近,以此达到使 \(\log\) 的底数无限接近 \(2\)。

应用场景

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

Day 1 - 二分的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  3. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  4. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  5. [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  6. [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  8. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  9. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  10. 2016 ACM/ICPC Asia Regional Dalian Online 1008 Function 二分+RMQ

    Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...

随机推荐

  1. QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇

      Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台.在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他 ...

  2. Dubbo SPI扩展机制源码详解(基于2.7.10)

    Dubbo SPI 一. 概述 本文主要分享 Dubbo 的拓展机制 SPI. 想要理解 Dubbo ,理解 Dubbo SPI 是非常必须的.在 Dubbo 中,提供了大量的拓展点,基于 Dubbo ...

  3. sourceTree .gitignore文件处理

    最近犯了个低级错误,在sourceTree中通过右键,直接将 工程文件加入到 ignore列表中.提交之后,别人拉下来代码一直显示报错 在意识到上面这个错误之后,一直想恢复却恢复不了,尝试从Sorce ...

  4. C++笔记(11)工厂模式

    建议直接空降至参考文献,点击链接 简单工厂模式 #include<iostream> using namespace std; class BasicCamera { public: vi ...

  5. LeetCode 688. Knight Probability in Chessboard “马”在棋盘上的概率 (C++/Java)

    题目: On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exact ...

  6. nginx resolver 指定多个DNS (2个DNS)

    nginx resolver 指定多个DNS (2个DNS) 直接在 resolver 后边填2个DNS,中间用空格 location / { resolver 223.5.5.5 114.114.1 ...

  7. vitual box 安装centos7

    vitual box下载地址: https://www.virtualbox.org/wiki/Downloads centos7下载地址: CentOS Linux 选择7-2009,x86-64 ...

  8. C#.NET Winform承载WCF RESTful API (硬编码配置)

    1.新建一个名为"WindowsForms承载WCF"的WINFORM程序. 2.在解决方案里添加一个"WCF 服务库"的项目,名为"WcfYeah& ...

  9. dubbo~全局异常拦截器的使用与设计缺陷~续

    上一次的介绍,主要围绕如何统一去捕获异常,以及为每一种异常添加自己的Mapper实现,并且我们知道,当在ExceptionMapper中返回非200的Response,不支持application/j ...

  10. java8 Lambda及Stream学习笔记

    Lambda表达式Lambda 表达式可以替代只有一个抽象函数的接口实现. Lambda表达式同时还提升了对集合.框架的迭代.遍历.过滤数据的操作. Lambda表达式使用场景任何有函数式接口的地方 ...