三分算法(Ternary Search Algorithm)是一种用于在单峰函数中寻找极值的优化算法。它通过将搜索区间分为三个部分并比较函数在两个划分点的取值,逐步缩小搜索范围来确定极值的位置。
三分算法的基本思路如下:
1. 初始化搜索区间,通常是整个定义域的区间。
2. 将搜索区间分为三个部分,通常采用两个划分点将整个区间分成三等份。
3. 计算两个划分点的函数取值。
4. 比较两个划分点的函数取值,如果其中一个划分点的函数值更大(或更小),则极值在该划分点的同侧。
5. 根据比较结果更新搜索区间,将较小(或较大)的划分点所在的区间作为新的搜索区间。
6. 重复步骤3到步骤5,直到搜索区间足够小,或达到一定的迭代次数。
7. 返回搜索区间的中点作为极值的近似位置。
三分算法的时间复杂度为O(log N),其中N为搜索区间的长度。它的优势在于可以在单峰函数中快速找到极值的位置,但不适用于非单调函数或多峰函数的寻优问题。
int sanfen(int l, int r)
{
double midl = (l + r) / 2.0;
double midr = (midl + r) / 2.0;
if (r - l < 1e-6)
{
return 1;
}
if (f(midl) < f(midr))
{
return sanfen(l, midr);
}
else
{
return sanfen(midl, r);
}
}