如何根据递归关系确定递归树的高度?

时间:2009-08-28 15:55:21

标签: recursion tree computer-science recurrence proof

如何确定在处理重复运行时构建的递归树的高度?它与确定常规树的高度有何不同?

alt text http://homepages.ius.edu/rwisman/C455/html/notes/Chapter4/ch4-9.gif

编辑:对不起,我的意思是添加如何从递归关系中获取递归树的高度。

5 个答案:

答案 0 :(得分:7)

如果递归的形式为T(n)= aT(n / b)+ f(n),则树的深度为n的对数基数b。

例如,2T(n / 2)+ n重复将具有深度为lg(n)的树(n的对数基数为2)。

答案 1 :(得分:2)

首先,如果这是一个家庭作业问题,请将其标记为。您链接的图像暗示您与CS 455一起,与Wisman教授合作。 :)

我将给出的主要提示是:树的高度显然取决于你何时到达“树叶”。建模函数递归关系的树叶是基本情况。因此,我希望看到N能够“快速”收缩到基本情况。

答案 2 :(得分:1)

递归树的高度取决于所讨论的递归算法。并非所有的分而治之算法都具有均匀的高度树,就像并非所有树结构都具有统一的高度一样。如果无法确定算法的最大可能高度,或者需要在运行时计算树的实际高度,则可以对递归函数使用变量global,在函数入口时递增,并递减它在功能退出。此变量将指示递归过程的当前级别。如有必要,您可以在第二个变量中保持此变量的最大值。

答案 3 :(得分:1)

任何树的深度是从节点到树根节点的最小边数。根节点的深度为0.

考虑递归T(n)= aT(n / b)它导致以下递归树

enter image description here

很明显树的深度是$ \ log_b n $深度与树的高度相同。

答案 4 :(得分:0)

什么,对您来说不是很明显? ;)这是一个很大的问题,如果除了人们喜欢挥手以外没有其他原因的话。但是,实践证明这一点确实很明显。

以下是根据Cormen等人的“算法简介”第4.4节中的示例进行的说明。

考虑T(n) = 3T(n/4) + cn^2。该关系表明大小为n的问题(例如数组)的时间复杂度。记住n代表什么很重要。由于复杂度T是根据T定义的,因此它是递归关系。

如果高度不明显,我们可以遵循Polya的建议并尝试使用直接推理,绘制图片或解决一些相关问题。我们可以通过直接在T出现的任何地方插入T的右手表达式来使用直接推理,

T(n) = 3T(n/4) + cn^2
     = 3[3T( (n/4)/4 ) + c(n/4)^2] + cn^2
     = 9T(n/16) + c(n/4)^2 + cn^2
     = 9[3T( (n/16)/4 ) + c(n/16)^2] + c(n/4)^2 + cn^2
     = 27T(n/64) + c(n/16)^2 + c(n/4)^2 + cn^2
     ...

绘制图片会生成一棵树。每次递归都会为每个孩子产生三个分支:

Initial pass
                   ____cn^2____
                  /      |     \
                 /       |      \
            T(n/4)    T(n/4)    T(n/4)


First recursion                 
                   ____cn^2____
                  /      |     \
                 /       |      \
          cn(n/4)^2  cn(n/4)^2  cn(n/4)^2
          /   |   \  /   |   \  /   |   \
       T(n/16)          ...            T(n/16)
                         .
...on down             
                   ____cn^2____
                  /      |     \
                 /       |      \
          cn(n/4)^2  cn(n/4)^2  cn(n/4)^2
          /   |   \  /   |   \  /   |   \
       T(n/16)          ...            T(n/16)
                         .
                         .
                         .
    T(1) ...                            ...  T(1)

到底是什么?

请记住,n是原始问题的大小(例如,数组中的元素数) 1 。这限制可能发生的递归次数。 边界条件将取决于递归发生的情况。对于数组,您可以想象递归会一直持续到仅剩一个元素为止。这将在T(1)发生。

边界如何与高度相关?

对我来说,巨大的启示是意识到树的高度与达到边界的高度相同。这就是波利亚(Polya)谈论的“相关问题”。我们可以将问题改写为

树在什么级别达到边界条件?

查看关系或树,请注意如何将n/4反复插入连续的递归中。这意味着子问题大小(其中n是原始问题大小)在第n/4^i级是i。在边界处,子问题的大小为1:

                n/4^i = 1
         log_4(n/4^i) = log_4(1)
log_4(n) - log_4(4^i) = 0
             log_4(n) = log_4(4^i)
             log_4(n) = i

最后一个等式告诉我们,树在i = log_4(n)时达到边界条件。由于树的高度是满足边界条件的级别,因此树的高度为log_4(n)

从这里开始,只需简单地得出@ejel给出的结论

如果T(n)= aT(n / b)+ f(n),则树的深度为对数的对数b

@xpda指出,递归树的高度将取决于算法。一种可能概括的结论是考虑算法在边界处的行为。


1 单词“问题”可能以不同的方式使用。首先,它可能意味着“手头的任务”,例如找到递归树的高度。但是,由于树是通过递归产生的,因此该问题以类似的形式(即子树)再次出现,因此“问题”的含义是“正在操作的集合的大小”,例如数组中元素的数量。