为什么这个算法是O(nlogn)?

时间:2016-09-02 14:17:59

标签: algorithm time-complexity big-o

我正在阅读一本关于算法分析的书,并找到了一个我不知道如何获得时间复杂度的算法,尽管书中说它是O(nlogn)

以下是算法:

sum1=0; 
for(k=1; k<=n; k*=2) 
  for(j=1; j<=n; j++) 
    sum1++;

3 个答案:

答案 0 :(得分:6)

在您的第一个循环for(k=1; k<=n; k*=2)中,变量kn步骤中达到log n的值,因为您在每个步骤中将值加倍。

第二个循环for(j=1; j<=n; j++)只是一个线性循环,因此需要n个步骤。

因此,由于循环是嵌套的,所以总时间为O(nlogn)

答案 1 :(得分:5)

也许说服自己O(n*lgn)运行时间的最简单方法是在一张纸上运行算法。考虑当n为64时会发生什么。然后外部循环变量k将采用以下值:

1 2 4 8 16 32 64

log_2(64)为6,即上述条款数加1。您可以继续这一推理,得出结论外循环将花费O(lgn)运行时间。

内环完全独立于外环,为O(n)。将这两个术语相乘得出O(lgn*n)

答案 2 :(得分:3)

添加一些数学细节...

a为外循环for(k=1; k<=n; k*=2)运行的次数。然后这个循环将运行2^a次(注意循环增量k*=2)。所以我们有n = 2^a。通过双方基础2登录来解决a,然后您将获得a = log_2(n)

由于内部循环运行n次,因此总计为O(nlog_2(n))