首页 > > > 算法浅谈——二分法的兄弟,三分法

这个函数的解。
这个时候就需要三分法出场了。

三分法会将区间分成三份,这个我们都已经知道了。分成三份,自然需要两个端点。这两个端点各有一个值,我们分别叫做
但是我们有两个中间点,该怎么逼近呢?
我们直接根据函数图像来分析,根据上图我们可以看出来,
,所以
。

我们画出图像来看,这种情况其实并没有区别,我们只会抛弃区间
,并不会影响极值点。
会不会极值点在
也就是说,三分法的精髓在于,每次通过比较两个值的大小,缩小三分之一的区间。直到最后区间的范围小于我们设定的阈值为止。算法并不难理解,但是当我们真正碰到二次函数的极值问题的时候,如果没有事先接触过三分法,很难一下想到算法。
三分法本身并不难,我们理解了算法之后,写出伪代码来就很容易了:
def trichotomy():
l, r = start, end
epsilon = 1e-6
# 我们自定义的终止条件是区间长度小于1d-6
while l + epsilon < r:
margin = (r - l) / 3.0
m1 = l + margin
m2 = m1 + margin
if f(m1) <= f(m2):
r = m2
else:
l = m1
return l
最后, 我们看一道三分法相关的算法题,来实际演练一下三分法吧。
这是一道POJ3737,链接如下:http://poj.org/problem?id=3737
公众号里不能超链接到外部,我来简单介绍一下题意。
题意很简单,当下我们拥有一块布,我们知道布的大小,要将布做成一个圆锥形。要使得圆锥形的体积最大,假设布在加工的过程当中没有损耗,请问这个圆锥的体积、底面半径和高分别是多少?
我这里先不放答案,大家不妨自己想一下,实在做不出来,在公众号内回复三分法答案,获取题解。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69966956/viewspace-3155820/ ,如需转载,请注明出处,否则将追究法律责任。