以下算法的时间复杂度是多少?
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。但在这里我们有while
和for
,所以我不知道。
答案 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)
。
希望这有助于您理解:)