三分查找

入门

适合单峰/单谷函数求极值,是二分查找的变体。

定义数组和目标值

可视化演示开发中

三分查找 的交互式动画即将上线,敬请期待。

// 源代码
1int ternarySearch(int arr[], int n, int target) {
2    int left = 0, right = n - 1;
3    while (right - left > 2) {
4        int third = (right - left) / 3;
5        int mid1 = left + third;
6        int mid2 = right - third;
7        if (arr[mid1] == target) return mid1;
8        if (arr[mid2] == target) return mid2;
9        if (arr[mid1] < target)
10            left = mid1 + 1;
11        else
12            right = mid2 - 1;
13    }
14    for (int i = left; i <= right; i++)
15        if (arr[i] == target) return i;
16    return -1;
17}

复杂度分析

时间 O(log n)
空间 O(1)
最优 O(1)
最坏 O(log n)

算法讲解

三分查找将区间 [left, right] 分为三段,得到两个中间点 mid1 和 mid2。

通过比较 mid1 和 mid2 处的值,可以判断极值在哪一段。

每次迭代可以排除 1/3 的区间,时间复杂度为 O(log₃n)。

它特别适合在单峰函数上寻找最大值或最小值。