下面显示的嵌套循环的时间复杂度是什么:
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)
答案 0 :(得分:1)
答案 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 / 2
和n = 3
,它只会执行一次(c = 2
)
所以,我们可以概括为
(n / c)2 = (n2/c2) = 1/c2 * n2
请记住,Big O只对变化率感兴趣。由于floor(3 / 2) == 1
是常量,因此会从计算中忽略它。
所以,结果是:
O(1/c2 * n2) = O(n2)