对于二分,设left,right为问题的两个极值,用min=left+(right-left)>>1或mid=(left+right)>>1,可以知道mid值,判断,然后进行更换。
显然,二分适用于单调函数,而对于一个二次函数就无效了。
这时,我们可以用三分搜索来做。
我们定义midl=(left+mid)>>1,midr=(right+mid)>>1。判断midl和midr就行了。
看看代码吧:(转自http://blog.csdn.net/u011787119/article/details/44598871)
double solve(double parameter) { // 计算函数值,即f(x) } double trisection_search(double left, double right) { // 三分搜索,找到最优解(求函数最大值下的自变量值) double midl, midr; while (right-left > 1e-7) { midl = (left + right) / 2; midr = (midl + right) / 2; // 如果是求最小值的话这里判<=即可 if(solve(midl) >= solve(midr)) right = midr; else left = midl; } return left; }
原文地址:https://www.cnblogs.com/Alex-leaves/p/8443607.html
时间: 2024-11-08 12:48:09