我正在尝试找到给定代码的增长函数。
int sum = 0;
for (int k = n; k > 0; k /= 2) {
cout<<k<<endl;
for (int i = 0; i < k; i++)
{
sum++;
cout<<i<<endl;
}
}
但是我陷入(int k = n; k > 0; k /= 2)
的第一个循环中,它正在以这种方式执行:
for n = 5 , it executes 3 times
n = 10 , 4 times
n = 100 , 7 times
n = 1000 , 10 times
我该如何概括呢?
答案 0 :(得分:4)
首先,10是大约1000的log_2。有关外循环的log_2(n)次迭代。但是,这并不会告诉您步骤的总数,因为您在其中执行了可变数量的步骤。
n + n / 2 + n / 4 + n / 8 + ... = 2n = O(n)。你在循环中做了很多事情,所以步数总是O(n)。当k = n时,大约一半的时间花在外循环的第一次迭代上。
答案 1 :(得分:3)
每一步k
除以2,切成两半。你需要多少次削减到零?
1次切割后,你有n/2
在2次削减后,你有n/4
经过3次削减,你有n/8
经过4次削减后,你有n/16
经过5次削减后,你有n/32
在x
裁减后,您有n/2x
。
那么,到n = 2x
多长时间?
答案很简单:x = log2(n)
。
你的循环运行log n
次。
但内循环的运行大小与这些部分相同。第一次运行的大小为n
,第二次运行为n/2
,第三次运行为n/4
,依此类推。这个内循环的所有运行的总和是:
n + n/2 + n/4 + n/8 + ... = 2n
。
因此总运行时间等于O(n)
(感谢Douglas Zare!)