这段代码中的增长函数和顺序是什么?
What is the growth function and order in this code?
我正在尝试理解这段代码的增长功能。
for (int count=0; count < n; count++) {
for (int count2=1; count2 < n; count2=count2*2) {
System.out.println(count + ", " + count2);
}
}
外循环是线性的,因为每次都递增 1。内部循环是 log(n) 因为您的上限必须呈指数增长才能跟上 count2 变量的增长,因此整个嵌套迭代是 nlog(n) 。
当您刚开始了解增长和秩序时,解决这些问题的一个好方法是通过视觉思考。参考下图及说明:
假设 n = 8 并且打印是恒定时间操作。
先分别看看循环。
外循环相当简单:
我们从计数 0 开始,每次将 count
递增 1,直到达到 n = 8。因此,我们必须递增 8/1 = 8 次才能完成循环。推广到n,循环会运行 n次。
内部循环稍微复杂一点:
我们从计数 1 开始,然后通过将 2 乘以 count2
来递增,直到达到 n = 8。这样,count2
在每次迭代时增加 2 倍,其值可以由下式确定2^k 其中 k 是迭代次数。要计算达到 n = 8 需要多少次迭代,求解 2^k = 8 或 k = log2(8) = 3。推广到 n 循环将 运行 for log2(n) 次。
结合这两个事实,对于外循环的每次迭代,内循环将是 运行,因此总而言之,它将需要 n * log2(n) 到 运行。因此,运行时间复杂度为O(nlog(n))
我正在尝试理解这段代码的增长功能。
for (int count=0; count < n; count++) {
for (int count2=1; count2 < n; count2=count2*2) {
System.out.println(count + ", " + count2);
}
}
外循环是线性的,因为每次都递增 1。内部循环是 log(n) 因为您的上限必须呈指数增长才能跟上 count2 变量的增长,因此整个嵌套迭代是 nlog(n) 。
当您刚开始了解增长和秩序时,解决这些问题的一个好方法是通过视觉思考。参考下图及说明:
假设 n = 8 并且打印是恒定时间操作。
先分别看看循环。
外循环相当简单:
我们从计数 0 开始,每次将 count
递增 1,直到达到 n = 8。因此,我们必须递增 8/1 = 8 次才能完成循环。推广到n,循环会运行 n次。
内部循环稍微复杂一点:
我们从计数 1 开始,然后通过将 2 乘以 count2
来递增,直到达到 n = 8。这样,count2
在每次迭代时增加 2 倍,其值可以由下式确定2^k 其中 k 是迭代次数。要计算达到 n = 8 需要多少次迭代,求解 2^k = 8 或 k = log2(8) = 3。推广到 n 循环将 运行 for log2(n) 次。
结合这两个事实,对于外循环的每次迭代,内循环将是 运行,因此总而言之,它将需要 n * log2(n) 到 运行。因此,运行时间复杂度为O(nlog(n))