这段代码的时间复杂度是多少以及如何?在Big-O

时间:2018-03-15 21:31:47

标签: algorithm time-complexity big-o space-complexity

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),任何人都可以告诉我我错过了什么吗? 任何帮助将不胜感激。

1 个答案:

答案 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)。