我正在尝试解决重复T(n) = T(n/8) + T(n/2) + T(n/4)
。
我认为首先尝试使用递归树方法,然后将其用作我对替换方法的猜测是个好主意。
对于树,由于没有在非叶级别进行任何工作,我认为我们可以忽略它,所以我试图想出叶子的上限,因为这是唯一相关的东西这里。
我认为树的高度是T(n/2)
的最长路径,其高度为log2(n)
。然后我假设树是完整的,所有级别都已填满(即我们有3T(n/2))
,因此我们在每个级别都有3^i
个节点,因此n^(log2(3))
离开。{{1那么就是T(n)
。
不幸的是,我认为这是一个不合理的上限,我想我已经让它有点太高了......关于如何解决这个问题的任何建议?
答案 0 :(得分:7)
这里可以使用的一个技巧是根据另一个变量重写重复。我们假设你写n = 2 k 。然后复发简化为
T(2 k )= T(2 k-3 )+ T(2 k-2 )+ T(2 < SUP> K-1 )。
设S(k)= T(2 k )。这意味着您可以将此重复重写为
S(k)= S(k-3)+ S(k-2)+ S(k-1)。
假设基本情况是S(0)= S(1)= S(2)= 1,只是为了简单起见。鉴于此,您可以使用各种方法来解决此问题。例如,annihilator method(链接的第5部分)在这里可以很好地解决这种重现,因为它是线性重复。如果你在这里使用消灭器方法,你就得到了
S(k) - S(k - 1) - S(k - 2) - S(k - 3)= 0
S(k + 3) - S(k + 2) - S(k + 1) - S(k)= 0
(E 3 - E 2 - E - 1)S(k)= 0
如果你找到方程式E 3 - E 2 - E - 1的根,那么你可以将重复的解作为这些的线性组合根源提升到k的力量。在这种情况下,事实证明重现is similar to that for the Tribonacci numbers,如果你解决了所有问题,你会发现复发解决了O(1.83929 k )形式的东西。
现在,既然知道2 k = n,我们知道k = lg n。因此,复发解决了O(1.83929 lg n )。我们让a = 1.83929。然后解决方案的形式为O(a lg n )= O(a (log a n)/ log a 2) )= O(n 1 / log a 2 )。这大约为O(n 0.87914 ...... )。您的初始上限O(n lg 3 )= O(n 1.584962501 ...... )明显弱于此。
希望这有帮助!
答案 1 :(得分:2)
有一种比@template提出的更简单的方法。除了Master's定理之外,还有一个Akra-Bazzi method可以让你解决这种类型的再现:
这正是你所拥有的。因此,您的g(x) = 0
,a1 = a2 = a3 = 1
和b1 = 1/2
,b2 = 1/4
和b3= 1/8
。所以现在你必须解决这个等式:1/2^p + 1/4^p + 1/8^p = 1
。
解决它p约为0.879
。您甚至不需要求解积分,因为它等于0
。因此,您的总体复杂度为O(n^0.879)
。