带递归的嵌套循环的大O时间复杂度

时间:2020-10-20 17:53:11

标签: java time-complexity

下面的代码片段的时间复杂度应该是什么

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)是正确的?如果没有,请解释

2 个答案:

答案 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)

如果需要形式证明,则可以很容易地遵循上述逻辑,并在需要时进行扩展。