下面的代码片段的时间复杂度应该是什么
void doSomething(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
doSomeOtherStuff(n);
doSomething(n - 1);
}
}
}
void doSomeOtherStuff(int n) {
for (int i = 0; i < n; i++) {
//did some other stuff
}
}
复杂度计算是否为:n ^ 2(n + n ^ 2)= O(n ^ 4)是正确的?如果没有,请解释
答案 0 :(得分:2)
根据我对第一个答案的评论,我认为该算法的复杂度比O(n ^ 4)差得多。 @ToddCaywood实际上首先在脑海中写下了我的想法。该算法实际上类似于:
O(n^(n^2))
一个不可能的坏结果。对于大型数据集,这件事将进入太空,再也不会回来。
我第一次看待这个问题的方式是,每个递归级别都添加了另一套NESTED for
循环。对于n==10
,您有20个嵌套的for循环。随着n
的增长,它越来越深。
答案 1 :(得分:0)
是的,O(n ^ 4)是正确的。
doSomeOtherStuff(n)显然是复杂度O(n),完成了n次,也完成了n次,所以内部是O(n ^ 3)。
牢记这一点,doSomething(n)的复杂度[让我们称T(n)] = O(n ^ 3)+ T(n-1),其中T(n-1)= O(n ^ 3 )+ T(n-2)等。展开为(n-1)(O(n ^ 3))+ O(n ^ 3)= n(O(n ^ 3))= O(n ^ 4)
如果需要形式证明,则可以很容易地遵循上述逻辑,并在需要时进行扩展。