获得以下递归实现的时间复杂度

时间:2013-06-19 05:06:47

标签: algorithm tree complexity-theory

/* Function to get diameter of a binary tree */
int diameter(struct node * tree)
{
   /* base case where tree is empty */
    if (tree == 0)
     return 0;

  /* get the height of left and right sub-trees */
  int lheight = height(tree->left);
  int rheight = height(tree->right);

  /* get the diameter of left and right sub-trees */
  int ldiameter = diameter(tree->left);
  int rdiameter = diameter(tree->right);


  return max(lheight + rheight + 1, max(ldiameter, rdiameter));
}


int height(struct node* node)
{
   /* base case tree is empty */
   if(node == NULL)
       return 0;

   /* If tree is not empty then height = 1 + max of left
      height and right heights */   
    return 1 + max(height(node->left), height(node->right));
} 

使用此实现查找树直径的时间复杂度如何为O(n ^ 2),其中n是树中节点的数量?

2 个答案:

答案 0 :(得分:0)

它是O(n ^ 2)因为高度计算也是递归的。 您可以编写递归关系并解决它。

其他Master's theorem

你可以看到f(n)是线性的,因此c = 1 因此,当a为4(递归使用4次)且b为2(在树的一半上)时,复杂性为log a到b

答案 1 :(得分:0)

D()表示diameter()H()表示height()。为方便起见,我们假设二叉树为Complete Binary Tree,以便左子树和右子树具有相同数量的元素。我们还假设二叉树中有N个元素。现在可以使用以下递归关系表示直径函数的时间复杂度。

D(N) = 2D(N/2) + 2H(N/2) + c1  ----- 1

由于diameter()中的以下递归调用,

  int lheight = height(tree->left);
  int rheight = height(tree->right);

  int ldiameter = diameter(tree->left);
  int rdiameter = diameter(tree->right);

现在让我们分析height()

表示height()的时间复杂度的递归关系是,

H(N) = 2H(N/2) + c2  ------ 2

由于height()中的以下递归调用,

return 1 + max(height(node->left), height(node->right));

现在H(N) = O(N logN)通过在2上应用Master Theorem。

将其替换为1,我们得到,

D(N) = 2D(N/2) + c3 N logN + c1   ------ 3

使用主定理解决 3 ,我们得到D(N) = O(N logN)

因此,递归函数diameter()的复杂性为O(N logN)