三分查找求最值
来源:互联网 发布:网页游戏的源码 编辑:程序博客网 时间:2024/06/05 22:43
二分查找 适用于单调函数中逼近求解某点的值。
如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。
下面的方法应该是三分查找的一个变形。
如图所示,已知左右端点L、R,要求找到白点的位置。
思路:通过不断缩小 [L,R] 的范围,无限逼近白点。
做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmid) 的大小来缩小范围。
当最后 L=R-1 时,再比较下这两个点的值,我们就找到了答案。
1、当 f(mid) > f(mmid) 的时候,我们可以断定 mmid 一定在白点的右边。
反证法:假设 mmid 在白点的左边,则 mid 也一定在白点的左边,又由 f(mid) > f(mmid) 可推出 mmid < mid,与已知矛盾,故假设不成立。
所以,此时可以将 R = mmid 来缩小范围。
2、当 f(mid) < f(mmid) 的时候,我们可以断定 mid 一定在白点的左边。
反证法:假设 mid 在白点的右边,则 mmid 也一定在白点的右边,又由 f(mid) < f(mmid) 可推出 mid > mmid,与已知矛盾,故假设不成立。
同理,此时可以将 L = mid 来缩小范围。
int three_divide(int left,int right){int mid,mmid;while(left<right-1){mid=(left+right)/2;mmid=(mid+right)/2;if(f(mid)>f(mmid))right=mmid;elseleft=mid;}return f(left)>f(right)?left:right;}
//另一种方法double three_divide(double left,double right){double mid1,mid2;while(righ-left>=eps){mid1=left+(right-left)/3;mid2=right-(rigth-left)/3;if(f(mid1)>f(mid2))right=mid2;elseleft=mid1;}return (left+right)/2;}
1 0
- 三分查找求最值
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 三分查找
- 唯一索引(unique index)和普通索引(index)
- (转)Android的消息机制之ThreadLocal的工作原理
- OpenJudge1.12素数对
- java序列化反序列化ArrayList集合
- Oracle11gR2静默安装与克隆安装
- 三分查找求最值
- 各大项目所用到的技术小记~汇总~持续更新
- 苹果笔记本设置MAC地址和ip地址
- c++文件的读取和写入
- eclipse导出java程序并且移到linux系统上运行
- linux系统命令
- noip2016划水记
- KCF跟踪算法代码整理
- API 25 (Android 7.1.1 API) widget.AbsoluteLayout