介绍
非常快地找到凸函数的极值点。
实现&原理
与二分法类似,三分算法先把区间分为长度相等的三段,那么l与r之间就有两个点,分别是:ll=l+(r-l)/3=(2l+r)/3和
rr=r-(r-l)/3=(l+2r)/3。
也可以二分再二分,即mid = (l+r) / 2,mmid = (mid + l) / 2。
如果ll比rr更靠近最值,我们就舍弃右区间,否则我们舍弃左区间。
时间复杂度O(logn)
算法的正确性:
- ll与rr在最值的同一侧。由于凸性函数在最大值(最小值)任意一侧都具有单调性,因此,ll与rr中,更大
(小)的那个数自然更为靠近最值。此时,我们远离最值的那个区间不可能包含最值,因此可以舍弃。 - ll与rr在最值的两侧。由于最值在中间的一个区间,因此我们舍弃任意一个区间后,并不会影响到最值。
总的来说,只需考虑两个点的在极值点的同一侧的情况就可以了。
典型题目:HDU4355,HDU2438,POJ3301
参考