大O和树遍历

时间:2009-06-29 13:45:16

标签: c++ tree big-o traversal

如果我有这样的功能:

void myfunction(node* root)
{
   for(int i = 0; i<root->children.size();i++)
   {
      myfunction(root->children[i]);
   }
}

那是n ^ 2的大O还是n的大O?如果你有一个for循环并且在for循环中有一个函数调用它自己,那么Big O是迭代次数乘以函数吗?

5 个答案:

答案 0 :(得分:9)

这是一个n树的有序遍历,但你击中了每一个元素,所以它是O(n)(big-theta更合适)。

答案 1 :(得分:2)

这是一个递归函数调用。您需要对递归关系进行一些调查,以计算Big O表示法中的时间复杂度。您的推理在一般案例中是正确的。在这个特定情况下,答案已经发布。

编辑:请参阅此link以获取有关递归函数的Big-Oh的讨论。

答案 2 :(得分:2)

您可以通过考虑具有N个节点的树会发生什么来解决这个问题。

该函数将为树中的每个节点调用一次,因此是O(N)和Big-Theta(N)。

考虑树的宽度与树的大O值有多大无关,它仍然具有相同的访问次数。

表示深度与宽度 会影响函数的空间注意事项。

如果树非常宽(比如宽度使得任何N的深度总是恒定的)那么遍历所需的堆栈空间是恒定的。
然而,如果宽度是固定的恒定值> 1然后所需的堆栈空间为O(log(N)) 如果您有宽度为1的退化情况,那么树将成为链表,空间要求为O(N)。
一些语言/编译器将能够优化递归,以便空间需求实际上是常量(但这取决于您在遍历期间正在执行/返回的内容)。

答案 3 :(得分:1)

  

在数学,计算机科学和   相关领域,大O表示法   描述了a的限制行为   参数倾向时起作用   特定价值或   无限,通常就简单而言   功能。 Big O符号允许它   用户按顺序简化功能   专注于他们的增长率:   具有相同的不同功能   增长率可以用   同样的O符号。

其余的here 关于你的例子,你肯定有O(n)。

答案 4 :(得分:0)

这是O(n),其中n是树中节点的总数