在算法世界中,C++三分搜索算法是一种用于在单峰函数或单谷函数上快速查找极值点的高效技术。与大家熟悉的二分查找不同,三分搜索将搜索区间划分为三部分,从而适用于更复杂的优化问题。本教程将带你从基础概念到代码实现,一步步掌握这一高效搜索算法。
三分搜索(Ternary Search)主要用于在单峰函数(先增后减)或单谷函数(先减后增)上寻找最大值或最小值。它通过不断缩小搜索范围,每次排除掉不可能包含极值点的三分之一区间,从而快速逼近目标。

假设我们要在一个定义在区间 [left, right] 上的单峰函数 f(x) 中找到最大值点。
m1 = left + (right - left) / 3m2 = right - (right - left) / 3 f(m1) 和 f(m2) 的大小f(m1) < f(m2),说明最大值在 [m1, right] 区间,更新 left = m1[left, m2] 区间,更新 right = m2下面是一个在单峰函数 f(x) = -(x - 5)*(x - 5) + 10 上查找最大值的C++三分查找实现:
#include <iostream>#include <cmath>using namespace std;// 定义单峰函数:f(x) = -(x-5)^2 + 10double f(double x) { return -(x - 5) * (x - 5) + 10;}// 三分搜索函数:在 [left, right] 区间找最大值double ternarySearch(double left, double right) { const double eps = 1e-9; // 精度控制 while (right - left > eps) { double m1 = left + (right - left) / 3.0; double m2 = right - (right - left) / 3.0; if (f(m1) < f(m2)) { left = m1; // 最大值在右三分之二区间 } else { right = m2; // 最大值在左三分之二区间 } } return (left + right) / 2.0; // 返回极值点位置}int main() { double left = 0.0, right = 10.0; double result = ternarySearch(left, right); cout << "最大值出现在 x = " << result << endl; cout << "最大值为 f(x) = " << f(result) << endl; return 0;}每次迭代都将搜索区间缩小为原来的 2/3,因此时间复杂度为 O(log₃ n),其中 n 是初始区间的长度(或元素个数)。这与二分查找的 O(log₂ n) 处于同一数量级,都是高效的高效搜索算法。
while (right - left >= 3),最后暴力检查剩余点通过本教程,你已经掌握了C++三分搜索算法的基本原理、实现方法和应用场景。无论是解决算法竞赛题还是实际工程中的优化问题,这项技术都能为你提供强大支持。记住,关键在于识别问题是否具有单峰/单谷性质——这是应用该C++算法教程所授知识的前提。
动手尝试修改上面的函数,看看能否在其他单峰函数上成功找到极值吧!
本文由主机测评网于2025-12-29发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251213718.html