寻找增长函数
Finding growth Function
我正在寻找给定代码的增长函数。
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
我如何概括它?
每一步将k
除以二,切成两半。您需要削减多少次才能归零?
1 次切割后你有 n/2
。
2 次削减后你有 n/4
.
削减 3 次后你有 n/8
.
4 次削减后你有 n/16
.
5 次削减后你有 n/32
.
x
削减后你有 n/2<sup>x</sup>
.
所以,还有多久 n = 2<sup>x</sup>
?
答案很简单:x = log<sub>2</sub>(n)
.
你的循环 运行 秒 log n
次。
但是内部循环 运行 是关于这些部分的大小的。第一个 运行 的大小是 n
,第二个是 n/2
,第三个是 n/4
,依此类推。这个内循环所有运行的总和是:
n + n/2 + n/4 + n/8 + ... = 2n
.
因此总 运行 时间等于 O(n)
(感谢 Douglas Zare!)
首先,10大约是1000的log_2。外循环大约有log_2(n)次迭代。但是,这并不能告诉您总步数,因为您在其中执行了可变数量的步数。
n + n/2 + n/4 + n/8 + ... = 2n = O(n)。您在循环内做的事情数量不变,因此总步数为 O(n)。当 k=n.
时,大约一半的时间花在外循环的第一次迭代上
我正在寻找给定代码的增长函数。
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
我如何概括它?
每一步将k
除以二,切成两半。您需要削减多少次才能归零?
1 次切割后你有 n/2
。
2 次削减后你有 n/4
.
削减 3 次后你有 n/8
.
4 次削减后你有 n/16
.
5 次削减后你有 n/32
.
x
削减后你有 n/2<sup>x</sup>
.
所以,还有多久 n = 2<sup>x</sup>
?
答案很简单:x = log<sub>2</sub>(n)
.
你的循环 运行 秒 log n
次。
但是内部循环 运行 是关于这些部分的大小的。第一个 运行 的大小是 n
,第二个是 n/2
,第三个是 n/4
,依此类推。这个内循环所有运行的总和是:
n + n/2 + n/4 + n/8 + ... = 2n
.
因此总 运行 时间等于 O(n)
(感谢 Douglas Zare!)
首先,10大约是1000的log_2。外循环大约有log_2(n)次迭代。但是,这并不能告诉您总步数,因为您在其中执行了可变数量的步数。
n + n/2 + n/4 + n/8 + ... = 2n = O(n)。您在循环内做的事情数量不变,因此总步数为 O(n)。当 k=n.
时,大约一半的时间花在外循环的第一次迭代上