C++ 为什么下面代码的时间复杂度是O(n^2)? void level\u order\u recursive(结构节点*t,int h)/'h'是我的二叉树的高度 {/'t'是根节点的地址 for(int i=0;i right!=NULL) print_level(t->right,i-1);//递归调用 } }
在最坏的情况下,时间复杂度将是O(n^2),但不能是2^n,因为每个级别的时间复杂度将是->O(n)+O(n-1)+O(n-2)+…+O(1)最坏的情况是O(n^2) 您混淆了h和n。h是树的高度。n显然是树中元素的数量。所以打印级别取最坏情况O($2^i),但也就是nC++ 为什么下面代码的时间复杂度是O(n^2)? void level\u order\u recursive(结构节点*t,int h)/'h'是我的二叉树的高度 {/'t'是根节点的地址 for(int i=0;i right!=NULL) print_level(t->right,i-1);//递归调用 } },c++,c,time-complexity,C++,C,Time Complexity,在最坏的情况下,时间复杂度将是O(n^2),但不能是2^n,因为每个级别的时间复杂度将是->O(n)+O(n-1)+O(n-2)+…+O(1)最坏的情况是O(n^2) 您混淆了h和n。h是树的高度。n显然是树中元素的数量。所以打印级别取最坏情况O($2^i),但也就是n 最坏的情况发生在退化树中,其中每个节点只有一个后续节点。在这种情况下,您有n个节点,但树的高度也是h=n。在这种情况下,对print_level的每次调用都会执行i步,将i从1加到h=n等于O($n^2) 您总是从树的根开始t,
最坏的情况发生在退化树中,其中每个节点只有一个后续节点。在这种情况下,您有n个节点,但树的高度也是h=n。在这种情况下,对print_level的每次调用都会执行i步,将i从1加到h=n等于O($n^2) 您总是从树的根开始
t
,每次增加一级(i
),直到到达树的高度h
你说这是一个二叉树,但你没有提到任何属性,例如平衡等等。所以我假设它可能是一个不平衡的二叉树,因此在最坏的情况下树的高度可能是h=n
,其中n
是节点数(这是一个完全不平衡的树,实际上看起来像一个列表)
这意味着level\u order\u recursive
循环n次。即,最坏的情况是树具有n
级别
print\u 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页和第4页,二元搜索算法类似于我们的情况,其时间复杂度为T(n)=T(n/2)+c
。
除此之外,左侧和右侧的子树都被浏览,因此下面的公式中的2T(n/2)是一个遍历算法,而不是搜索算法
在这里,我将遵守问题,使用“h”而不是“n”
使用递归关系,可以得到以下证明:
每个级别的时间复杂度是如何线性的?像O(n)。你能解释一下吗?你在这里打印的“数据”是什么:cout data@meJustAndrew这是一个整数数据。这是我在这里没有提到的节点结构中定义的。它是二叉树的水平顺序遍历的递归版本。这个代码的时间复杂度应该是O(n^2)。请你检查一下,没有一点解释就没有多大意义。我用一个解释“前言”了我的回答。如果你需要更多的细节,请告诉我。
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);
}
}
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
}
}