寻找增长功能

时间:2015-03-22 17:26:19

标签: c++ time-complexity big-o

我正在尝试找到给定代码的增长函数。

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

我该如何概括呢?

2 个答案:

答案 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/32x裁减后,您有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!)