这段代码的时间复杂度是多少?如何?在大O
what is the time complexity of this code and how? in Big-O
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),谁能告诉我我错过了什么?
任何帮助将不胜感激。
让我们看一下这段代码。
首先,你可以注意到内部循环不依赖于外部,所以它的复杂度不会在任何迭代中改变。
for (j = 2; j <= n; j = j * 2) {
k = k + n/2;
}
我想,你的知识足以理解,这个循环的复杂度是O(log n)。
现在我们需要了解这个循环将执行多少次。所以我们应该看看外部循环
for (i = n/2; i <= n; i++) {
并找出 n / 2 次迭代,或 O(n) Big-O符号。
结合这些复杂性,您会发现,您的 O(log n) 循环将执行 O(n) 次,所以总复杂度将是 O(n) * O(log n) = O(n log n).
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),谁能告诉我我错过了什么? 任何帮助将不胜感激。
让我们看一下这段代码。
首先,你可以注意到内部循环不依赖于外部,所以它的复杂度不会在任何迭代中改变。
for (j = 2; j <= n; j = j * 2) {
k = k + n/2;
}
我想,你的知识足以理解,这个循环的复杂度是O(log n)。
现在我们需要了解这个循环将执行多少次。所以我们应该看看外部循环
for (i = n/2; i <= n; i++) {
并找出 n / 2 次迭代,或 O(n) Big-O符号。
结合这些复杂性,您会发现,您的 O(log n) 循环将执行 O(n) 次,所以总复杂度将是 O(n) * O(log n) = O(n log n).