前言

对于单调函数,如果找到了其单调性,我们就可以使用二分的方法对其进行搜索。所以二分搜索的首要前提是具有单调性。当搜索的函数不具有单调性时,二分搜索就显得相形见绌了。所以对于较为复杂的函数,我们可以采用三分搜索和模拟退火的方法。这里主要来分析一下三分搜索算法。

前提

三分搜索适用于具有凹凸性的函数,如图所示为一个具有凸性质的函数(注意不一定为一个标准的二次函数,只需要在唯一极值两端的单调性不同即可)在这个函数中我们就可以使用三分搜索。

过程

(这一部分摘自三分查找-pi9nc的专栏,并略微进行修改。)

假设搜索最左端为 L L,最右端为RR,这两个点的中点为 mid mid。
三分搜索基于二分搜索,在右端点 R R与中点midmid之间又开辟了一个新的搜索点 midmid midmid,通过这两个中间点的比较,来确定下一步的收缩情况。

1、当f(mid)>f(midmid)的时候,我们可以断定midmid一定在白点的右边。反证法:假设midmid在白点的左边,则mid也一定在白点的左边,又由f(mid)>f(midmid)可推出midmid<mid,与已知矛盾,故假设不成立。 1、当 f(mid) > f(midmid) 的时候,我们可以断定 midmid一定在白点的右边。 反证法:假设 midmid 在白点的左边,则 mid 也一定在白点的左边,又由 f(mid) > f(midmid) 可推出 midmid

所以,此时可以将R=midmid来缩小范围。 所以,此时可以将 R = midmid 来缩小范围。

2、当f(mid)<f(midmid)的时候,我们可以断定mid一定在白点的左边。反证法:假设mid在白点的右边,则midmid也一定在白点的右边,又由f(mid)<f(midmid)可推出mid>midmid,与已知矛盾,故假设不成立。 2、当 f(mid) midmid,与已知矛盾,故假设不成立。

同理,此时可以将L=mid来缩小范围。 同理,此时可以将 L = mid 来缩小范围。

注意点
1、 mid mid与 midmid midmid在最值的同一侧。由于适用函数在最大值(最小值)任意一侧都具有单调性,因此, mid mid与 midmid midmid中,更大(小)的那个数自然更为靠近最值。此时,我们远离最值的那个区间不可能包含最值,因此可以舍弃。
2、 mid mid与 midmid midmid在最值的两侧。由于最值在中间的一个区间,因此我们舍弃一个区间后,并不会影响到最值。

举例1

The Moving Points
HDU - 4717
There are N points in total. Every point moves in certain direction and certain speed. We want to know at what time that the largest distance between any two points would be minimum. And also, we require you to calculate that minimum distance. We guarantee that no two points will move in exactly same speed and direction.
Input
The rst line has a number T(T<=10) T (T , indicating the number of test cases.
For each test case, first line has a single number N(N<=300), N (N which is the number of points.
For next N lines, each come with four integers Xi,Yi,VXi X_i, Y_i, VX_i and VYi(−106<=Xi,Yi<=106,−102<=VXi,VYi<=102),(Xi,Yi) VY_i (-10^6 is the position of the i th point, and (VXi,VYi) (VX_i , VY_i) is its speed with direction. That is to say, after 1 second, this point will move to (Xi+VXi,Yi+VYi). (X_i + VX_i , Y_i + VY_i).
Output
For test case X, output “Case #X: ” first, then output two numbers, rounded to 0.01, as the answer of time and distance.
Sample Input
2
2
0 0 1 0
2 0 -1 0
2
0 0 1 0
2 1 -1 0
Sample Output
Case #1: 1.00 0.00
Case #2: 1.00 1.00

这个题可以从中分析,这个函数的变化时不具有单调性的,所以用二分的方法肯定不行,但是进一步分析,我们可以得到,首先一定有一个且只有一个time点,当这个time点时,任意两点之间距离的最大值最小,且这个值的两端的单调性是相反的,都一定会大于这个time值时的结果,这个时候我们就可以用三分的方法去做。(证明过程可以用反证法,根据题意可以得到任意两点之间的距离一定是一个一次函数或者是一个开口向上的抛物线函数,假设有两个点使得结果最小,那么根据题意也就是有两个time点,所有函数都小于一个k值,根据单调性可以得到经过第一个time点后,不存在一个点,所有函数都小于这个time点的结果k值,读者可以自己证明。)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#define INF 0x7ffffff
#define eps 1e-6
using namespace std;struct Node
{double x,y,vx,vy;
}nodes[330];double GetDistance(Node a, Node b,double TIME){return sqrt(((a.x+TIME*a.vx)-(b.x+TIME*b.vx))*((a.x+TIME*a.vx)-(b.x+TIME*b.vx))+((a.y+TIME*a.vy)-(b.y+TIME*b.vy))*((a.y+TIME*a.vy)-(b.y+TIME*b.vy)));
}int N;
double cal(double mid){double res =0;for(int i=0;i<N;i++){for(int j=i+1;j<N;j++){res = max(res,GetDistance(nodes[i],nodes[j],mid));}}return res;
}int main()
{int TotalNumber,CasesNumber=1;cin>>TotalNumber;while(TotalNumber--){double Time=0,Distance=0;cin>>N;for(int i=0;i<N;i++){scanf("%lf%lf%lf%lf",&nodes[i].x,&nodes[i].y,&nodes[i].vx,&nodes[i].vy);}double l = 0,r = INF;while((r-l)>eps){double mid1 = (r+l)/2;double mid2 = (r+mid1)/2;if(cal(mid1) >= cal(mid2)) l = mid1+eps;else r = mid2-eps;}Time = l,Distance = cal(l);printf("Case #%d: %.2f %.2f\n",CasesNumber++,Time,Distance);}return 0;
}

[搜索算法]三分搜索初步相关推荐

  1. 二分搜索与三分搜索的应用

    二分搜索与三分搜索的应用: 二分和三分都利用了分治的思想,都是通过不断缩小查找的范围,把问题分解为更小的子问题直到找到解为止,,二分的时间复杂度为log2(n),而三分的时间复杂度为3log3(n), ...

  2. java搜索引擎创建索引_搜索引擎系列 ---lucene简介 创建索引和搜索初步

    一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子 ...

  3. 搜索算法——深度搜索

    前言:对于同一道题目,深度搜索和广度搜索有时都能用,深度搜索也与回溯有无法分割的联系,所以是有一些题目会有交叉,我这里只是一个大致的分类.学习资源:力扣.代码随想录.<LeetCode 101 ...

  4. 搜索算法---深度优先搜索

    目录 一.通过下面一个问题总结深度优先搜索 1.深度优先搜索的一般步骤 2.深度优先搜索的特点 3.深度优先搜索的代码实现 二.例题分析 1.员工重要性 2.图像渲染 3.岛屿的周长 4.被围绕的区域 ...

  5. 三分搜索 (算法设计与分析课后习题)

    三分搜索算法的做法是:它先将待查元素x与n/3处的元素比较,然后将x与2n/3处的元素进行比较.比较的结果或者找到x,或者将搜索范围缩小的原来的n/3 1)编写C++程序实践算法 2)分析算法的时间复 ...

  6. 三分搜索--hdu2241 考研路茫茫——早起看书

    考研并不是说说就可以了,要付诸于行动. 对于Lele来说,最痛苦的事莫过于早起看书了,不过为了考研,也就豁出去了.由于早起看书会对看书效率产生影响,所以对于要什么时候起床看书,还是有必要考虑的. 经过 ...

  7. 飞书搜索初步分析-以移动端为例

    以下主要从触达路径.搜索中间页和结果页三个主要方面对飞书搜索进行介绍,可实现快速使用飞书搜索.发现已有亮点和存在的不足三个主要目的. (由于case较少,很多内容的召回.排序逻辑不好分析) 主要亮点: ...

  8. 搜索初步-暴力枚举总结与举例

    暴力枚举 一.过程: 暴力枚举是将所有情况都进行枚举出,并找到自己的目标的值的过程. 二.方法: 1.用多重循环嵌套,用来寻找在一个数组中的一个值是否与其他的一个或多个值相关. (这里的相关表示为加减 ...

  9. 二进制树形搜索算法_二进制搜索

    二进制树形搜索算法 二进制搜索用于在 值的排序列表 . 它选择排序值数组中的中间元素,并将其与目标值进行比较: 这就是我们在数组中寻找的关键. 如果它小于目标值,则在中间元素之后搜索,直到数组末尾. ...

最新文章

  1. LabVIEW设置应用程序显示标签透明
  2. 真正的中台价值,「炒作」之后才被看见
  3. angular1x初始与架构演进(三)Ui-Router+OcLazyLoad加载模块
  4. Flink从入门到精通100篇(二十三)-Apache Flink在滴滴的应用与实践
  5. [转]Vim常用命令速查
  6. Android Telephony分析(六) ---- 接口扩展(实践篇)
  7. java内部类选择题_java内部类详解(附相关面试题)
  8. sql 存储过程 盲注入_一次非常规 SQL 注入(informixsql)的利用过程
  9. win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了
  10. Python在HTTP接口测试中的应用
  11. 使用Kotlin创建动态Android TextWatcher
  12. 常用编程语言介绍和特点
  13. 2022世界电信日|九州云携车路协同OpenV2X探索5G边缘计算新生态
  14. 25项工程师必备技能 学习理论/学习曲线
  15. 如何把flv视频转成mp4?
  16. 阿里巴巴编码规范考试答案
  17. 【解决】linux磁盘扩容大全:新增磁盘、原磁盘扩容、home分区root分区扩容
  18. 好用的企业邮箱怎么选择?可用邮箱大全
  19. 长期有效的Google Adsense英文高单价关键词
  20. linux 命令 xxd linux下查看二进制文件

热门文章

  1. springboot配置内置tomcat的日志
  2. html中js隐藏div的高度,javascript获取隐藏元素(display:none)的高度和宽度的方法
  3. PySide2与PyQt5区别
  4. Java工程师(面试)
  5. 华为OD机试 - 自动曝光(C 语言解题)【独家】
  6. [Unity3D]-协程的介绍和使用
  7. 科普篇:TD-LTE
  8. 【保姆级·创建对象】如何通过Supplier创建对象
  9. Echars的下载和使用
  10. 梯度下降法-优化算法-机器学习