通缉:有序二叉树输出方法的递推公式

时间:2012-07-09 01:49:39

标签: java complexity-theory recurrence inorder

我在搜索这个java方法的递归公式时遇到了一些问题

void printInorder(Node<T> v) {
    if(v != null) {
        printInorder(v.getLeft());
        System.out.println(v.getData());
        printInorder(v.getRight());
    }
}

一些标准:

  • 它是一个完整的二叉树(每个内部结有2个孩子,每个叶子都有相同的深度)
  • 树有n个节点,复杂度为O(n)

我必须找到与depth h树的n knots相关的递推公式,作为额外的奖励,我需要推断出导致O(n)的显式公式这一点。

现在,这就是我得到的:

d = depth of the tree
c = constant runtime for execution of the method itself
d = 1: T(n) = c
d = 3: T(n) = T(d=1) + T(d=2) + T(d=3) + c

我用例子d = 3来为自己澄清事情,我很难进一步打破这个问题。我的假设是否正确?


编辑: 下一步尝试

[x] = { x in real numbers : max([x]) <= x }, [x] rounded down to next full number
d = 1: T(d) = 1
d > 1: T(d) = 2^(h-1) * T(n/(2^(h-1)))

1: T(h)  = T(i = 0) + T(i = 1) + ... T(i = h-1)
2: T(h) <= (2^(0-1) + n/(2^(0-1))) + (2^(1-1) + n/(2^(1-1))) + ... + (2^(h-2) + n/(2^(h-2)))
3: T(h)  = n + n + ... + n
4: T(h)  = (h-1)n
5: T(h)  = O(n)

因为树的每个深度级别恰好包含2 ^(h-1)个节点,所以可以忽略第4行中的h因子,因为n与最终结果更相关。

2 个答案:

答案 0 :(得分:3)

T(n)= T(n / 2)+ T(n / 2)+ 1

  • 0级有1次操作。

  • 1级有2个操作。

  • 2级有4个操作。

  • 等级k有2 ^ k次操作。

  • 树的深度是lgn。

1 + 2 + ... + 2 ^ LGN =
2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ LGN =
(2 ^(lgn + 1)-1)/(2-1)= 2 * 2 ^ lgn =
2n个。

答案 1 :(得分:1)

这是使用平滑度规则的另一种方法(Levitin, The Design&amp; Analysis of Algorithms,2nd Ed。,481-82),它允许像这样的递归关系表示为而是一个指数。

Demonstration of smoothness rule.

任何方法 - 前向或后向替换 - 都适用于此问题。我发现在许多情况下,后向替换更容易消化。