【问题标题】:Why time complexity of following code is O(n^2)?为什么以下代码的时间复杂度是 O(n^2)?
【发布时间】:2016-10-27 21:41:55
【问题描述】:
void level_order_recursive(struct node *t , int h) //'h' is height of my binary tree
{                                                 //'t' is address of root node
    for(int i = 0 ; i <= h ; i++)  
    {
        print_level(t , i);
    }
} 

每次调用 print_level() 后,我认为递归函数被调用 (2^i) 次。所以 2^0 + 2^1 + 2^2 ....2^h 应该给出 O(2^n) 的时间复杂度。我哪里错了?

void print_level(struct node * t , int i)
{
    if( i == 0)
        cout << t -> data <<" ";
    else
        {
            if(t -> left != NULL)
                print_level(t -> left , i - 1);   //recursive call
            if(t -> right != NULL)
                print_level(t -> right , i - 1); //recursive call
        }
}

【问题讨论】:

  • 你在这里打印的“数据”是什么:cout data
  • @meJustAndrew 它是一个整数数据。这是在我在这里没有提到的节点结构中定义的。它的递归版本的二叉树的级别顺序遍历。这段代码的时间复杂度应该是 O(n^2)。你能检查一下吗here

标签: c++ c time-complexity


【解决方案1】:

你混淆了 h 和 n。 h 是树的高度。 n 显然是树中元素的数量。所以 print_level 采用最坏情况 O ($2^i),但这也只是 n。

当你有一棵退化树时,最坏的情况会发生,其中每个节点只有一个后继节点。在这种情况下,您有 n 个节点,但树的高度也是 h = n。在这种情况下,每次调用 print_level 都需要 i 步,从 1 到 h = n 的 i 相加得到 O ($n^2)。

【讨论】:

    【解决方案2】:

    你总是从树的根t 开始,每次增加一级 (i),直到达到树的高度h

    你说它是一棵二叉树,但你没有提到任何属性,例如平衡左右。所以我假设它可能是一棵不平衡的二叉树,因此在最坏的情况下树的高度可以是h = n,其中n 是节点数(这是一个完全不平衡的树,实际上看起来像一个列表)。

    所以这意味着level_order_recursive 循环n 次。 IE。最坏的情况是树有n 级别。

    print_level 接收根节点和要打印的级别。它递归地调用自己直到它达到级别并打印出该级别。
    即它循环 i 次(递归调用每次将 i 减一)。

    所以你有1 + 2 + 3 + ... + h 迭代。因为h = n 你得到1 + 2 + 3 ... + n 步骤。这是(n * (n+1))/2(高斯和公式),位于O(n^2)

    如果您可以确保树是平衡的,那么您将改善最坏的情况,因为高度将是h = ld(n),其中 ld 表示二进制对数。

    【讨论】:

      【解决方案3】:

      基于thisthat,第 3 页和第 4 页,类似于我们案例的二分查找算法的时间复杂度为 T(n) = T(n/2) + c。 除此之外,左右子树都被浏览,因此下面公式中的 2T(n/2),因为这是一种遍历算法,而不是搜索算法。

      在这里,我将遵从问题并使用“h”而不是“n”。

      使用递归关系,你得到以下证明:

      【讨论】:

      • 没有一点解释就没有多大意义。
      • 我用解释“前言”了我的回答。如果您需要更多详细信息,请告诉我。
      【解决方案4】:

      在最坏的情况下,时间复杂度将为 O(n^2) 但不能为 2^n,因为每个级别的时间复杂度将是-> O(n) + O(n-1) + O(n- 2) + ... + O(1),最坏的情况是 O(n^2)。

      【讨论】:

      • 每个级别的时间复杂度如何是线性的?像 O(n) 。你能解释一下吗?
      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2018-03-19
      • 2015-08-22
      相关资源
      最近更新 更多