如何找到嵌套for循环的时间复杂度

时间:2016-03-05 03:11:57

标签: language-agnostic big-o time-complexity

下面显示的嵌套循环的时间复杂度是什么:

1)

for (int i = 1; i <=n; i += 2) {
    for (int j = 1; j <=n; j += 2) {
        // some O(1) expressions
    }
}

2)

for (int i = 1; i <=n; i += 3) {
    for (int j = 1; j <=n; j += 3) {
        // some O(1) expressions
    }
}

一般来说:

for (int i = 1; i <=n; i += c) {
   for (int j = 1; j <=n; j += c) {
      // some O(1) expressions
   }
}

以下是真的吗?

O(nc)

3 个答案:

答案 0 :(得分:1)

对于一般情况,内环具有O(n),外环具有O(n)。因此,对于外部循环的每次迭代,内部循环迭代n次(c对于复杂性的顺序无关紧要,应该被视为1)。如果外循环迭代n次,则内循环中的迭代总数为n * n或O(n ^ 2)。

答案 1 :(得分:1)

想象一下有10把椅子(这里是n) 在一个for循环中,你在所有的椅子上进行迭代,假设你坐在所有的椅子上,所以总共需要坐10次坐在所有椅子上进行给定的循环。

现在想象一下你坐在第一把椅子上,让你的朋友一个接一个地坐在椅子上,包括你的椅子,所以总的来说,你的朋友必须坐在10把椅子上。 现在你选择了第二把椅子,再次请你的朋友再次坐在每把椅子上,所以他总是要坐在10把椅子上。

同样地,你可以选择第3,第4 ......等椅子,所以总的来说,你的朋友必须为你选择的每把椅子坐10把椅子。

10 + 10 + ... = 100次

相当于10 ^ 2 = 100

所以复杂度是O(n ^ 2),其中n是椅子的数量。

答案 2 :(得分:1)

您的算法将执行array2 . filter(word => array1 . some(string => string.endsWith(word) ) ) 次迭代。我们正在划分,因为我们正在为每次迭代跳过(n / c) * (n /c)个字符。见:

c

将进行for (var i = 0; i <= n; i = i + 1) 次迭代

n / 1

将进行for (var i = 0; i <= n; i = i + 2) 次迭代

*请注意,结果将被覆盖。也就是说,如果n / 2n = 3,它只会执行一次(c = 2

所以,我们可以概括为

(n / c)2
= (n2/c2) 
= 1/c2 * n2

请记住,Big O只对变化率感兴趣。由于floor(3 / 2) == 1是常量,因此会从计算中忽略它。

所以,结果是:

O(1/c2 * n2) = O(n2)