算法的O(n)或O(n)^ 2时间复杂度?

时间:2015-08-18 15:13:27

标签: algorithm

以下算法的时间复杂度是多少?

int j = 0;
while (j<n) {
    for (int i = 0; i < n; i++) {
        x++;
        j++;
    }
}

我尝试过并按如下方式计算:n * n = n ^ 2,因此结果为O(n)^ 2.

但我还想到它也可能是这样的:n + n = 2n。结果:O(n)。

我知道如果你有两个for循环,你应该乘以你的n。但在这里我们有whilefor,所以我不知道。

2 个答案:

答案 0 :(得分:2)

它实际上只是O(n)..(不是O(n + n),不是O(2n),不是O(n ^ n),只是O(n)) 因为你在内循环中将j增加到n 一旦完成n元素的内部循环,外部条件将为false ..因此它将在n次迭代后退出

答案 1 :(得分:1)

我认为你对使用涉及循环的程序确定时间复杂性的理解有点偏。一般方法是计算迭代次数。通用程序的复杂性:

Loop until SomeCondition:
    DoStuff()

O([#iterations]*[complexity of DoStuff])。因此,如果迭代次数与某个变量n成比例且DoStuff与某个变量m成比例,那么此程序为O(n*m)

回到你的问题:我们看到内部for循环与变量n成比例。现在我们问自己&#34; while循环达到其条件需要多少次迭代?&#34;。那取决于每次迭代增加多少j!正如CaldasGM所指出的那样j对于内部for循环的每次迭代都会增加1。这意味着j每次迭代增加n,因此while循环将在一次迭代后退出!

因此该程序的复杂性为O([#iterations]*[Complexity of loop contents]) = O([1*n]*[1]) = O(n)

希望这有助于您理解:)