三分查找求最值

来源:互联网 发布:网页游戏的源码 编辑:程序博客网 时间: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
原创粉丝点击