【问题标题】:Recurrence relation for given algorithm?给定算法的递归关系?
【发布时间】:2016-01-20 08:51:01
【问题描述】:
int print4Subtree(struct Node *root) {
    if (root == NULL)
      return 0;
    int l =  print4Subtree(root->left);
    int r =   print4Subtree(root->right);
    if ((l + r + 1) == 4)
       printf("%d ", root->data);
    return (l + r + 1); }

此算法/代码在二叉树中找到恰好具有 4 个节点的子树的数量,它以自下而上的方式工作。 我知道这段代码的时间复杂度是 O(n) ,空间复杂度是 O(log n) ,因为它使用递归。

代码的重复关系是什么?

我尝试绘制 T(n) = 2T(n-1)+1 ,这显然是错误的!

【问题讨论】:

  • 在递归关系中,n 不是整数。应该是一棵树。然后,T(n) = 1 + T(n.left) + T(n.right)。形式上,它不仅取决于节点的数量,还取决于它们的结构。
  • 你的公式T(n) = 2T(n-1)+1,这个n不是节点数。只有当树是平衡二叉树时才可以使用

标签: algorithm binary-tree time-complexity recurrence


【解决方案1】:

只有在对树的结构比较了解的情况下,才能单独用n来谈论递归关系,例如:

案例1:每个节点只有一个子含义 T(n) = T(0) + T(n-1 ) + k
案例 2: 任何级别的子树都是平衡的,因此 T(n) = 2 T((n-1)/2) + k。

这两种情况都会导致 O(n),但这两种情况只是极少数可能的树。对于更通用的方法,您必须使用像 T(n) = T(a) + 这样的公式T(b),其中 ab 是由你的树。您仍然可以使用strong induction 从这种公式中建立结果。

以下是我将使用的确切公式和方法:
T(n) = nk + m nc,其中 mnn + 1。(注意:我使用的是 k 用于递归步骤的开销,c 用于基本/空步骤的开销)。

基本情况(n=0):
对于空节点 T(0) = c 所以 T(n) = kn em> + mnc ,
其中 mn = 1 ≤ n+1 = 1。
归纳步(T (x) = xk + mxc 对于所有 x n
):
大小为 n 的子树有两个大小为 ab 的子树(ab 可以是 0) 使得 n = a + b + 1.
T (n) = T(a) + T(b) + k = ak + mac + bk + mbc + k = (a+b+1)k + (ma+mb)c = nk + mnc ,
其中 mn = ma + mba + 1 + b + 1 = n + 1.

使用 mn 的原因仅仅是为了使证明更顺畅,因为 null 案例的确切数量实际上是受树结构影响的(在前一种情况下,它是 log n)。所以 T(n) 最多是 O(n) 因为 nk 项,并且可以是由于 mnc 上的界限,比 O(n) 最差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    相关资源
    最近更新 更多