我正在阅读一本关于算法分析的书,并找到了一个我不知道如何获得时间复杂度的算法,尽管书中说它是O(nlogn)
。
以下是算法:
sum1=0;
for(k=1; k<=n; k*=2)
for(j=1; j<=n; j++)
sum1++;
答案 0 :(得分:6)
在您的第一个循环for(k=1; k<=n; k*=2)
中,变量k
在n
步骤中达到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))
。