这个算法的运行时间很长

时间:2016-05-22 17:24:35

标签: time-complexity big-o

我发现很难分析算法的时间复杂度。以此算法为例,如何在O表示法中找到运行时间?

loop(n)  
i = 1  
while i ≤ n  
    j = 1  
    while j ≤ i  
        j = 2 ∗ j  
    i = i + 1  

2 个答案:

答案 0 :(得分:1)

当给出这样的代码时,它往往有助于从内到外工作。你的内循环在这里给出:

j = 1
While j <= i 
    j = 2 * j

这个循环通过反复加倍j直到它大于i来工作。在超过i之前可以加倍1的次数是Θ(log i),因此每次运行内部循环时它都会Θ(log i)工作。

外部循环从1到n计数,因此完成的工作是

  

log 1 + log 2 + ... + log n

     

= log(1 * 2 * ... * n)(使用对数的属性)。

     

= log(n!)

     

=Θ(n log n)。

最后一步是Stirling's approximation

总的来说,时间复杂度是Θ(n log n)。

答案 1 :(得分:0)

从你的帖子我明白,你知道O符号的含义,但在应用它时有一些问题。在这个简单的例子中,足以确定执行循环的次数(取决于您的输入大小)。要获得最终值,您必须将其组合起来。

第一步:分析每个循环的执行次数。 (非循环或递归语句有O(1)。)

while(i<=n) 
... 
i=i+1

执行n次,因此O(n)

内循环    而(J&LT; = I)       当J = J * 2

执行i / 2次,但我受外环的n限制。所以这是O(n)。

由于在外环中有一个带O(n)的内环,你必须乘以渐近线,即n * n =&gt;为O(n ^ 2)