int i, j, k = 0;
for (i = n/2; i <= n; i++) {
for (j = 2; j <= n; j = j * 2) {
k = k + n/2;
}
}
我遇到了这个问题,这就是我的想法。 外循环将运行N / 2次,内循环将运行logN次,因此它应该是N / 2 * logN。但这不是正确的答案。 正确答案是O(NlogN),任何人都可以告诉我我错过了什么吗? 任何帮助将不胜感激。
答案 0 :(得分:0)
让我们来看看这段代码。
首先,您可以注意到内部循环不依赖于外部循环,因此它的复杂性在任何迭代都不会改变。
for (j = 2; j <= n; j = j * 2) {
k = k + n/2;
}
我认为,你的知识足以理解,这个循环的复杂性是 O(log n)。
现在我们需要了解这个循环的执行次数。所以我们应该看看外部循环
for (i = n/2; i <= n; i++) {
并发现,在Big-O表示法中会有 n / 2 次迭代或 O(n)。
结合这些复杂性,您会发现 O(log n)循环将执行 O(n)次,因此总复杂度将为< em> O(n)* O(log n)= O(n log n)。