如果我有这样的功能:
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是迭代次数乘以函数吗?
答案 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是树中节点的总数