2016-05-22 83 views
1

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

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

回答

0

从你的文章我明白,你知道O符号的含义,但有一些应用它的问题。在这个简单的例子中,确定循环执行的次数(取决于您的输入大小)就足够了。为了获得最终的价值,你必须把它结合起来。

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

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

被执行n次,从而为O(n)

内环 而(j < = I) 当J = J * 2

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

由于有在外环是内环与O(N)必须乘以asymptitics,即N * N =>为O(n^2)

+0

您对内部循环的分析虽然在技术上是正确的,但并不是一个严格的界限,所以您的整体答案并不是一个严格的界限。 – templatetypedef

+0

实际上这个例子来自一个旧的考试,其中所谓的正确答案是O(n * log(n)) – Trondheim

+0

是的你是对的我的回答是准确的 – sim

1

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

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

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

外环从1计数至n,所做的工作是

日志1 +日志2 + ... +日志N

=日志(1 * 2 * .. * n)(使用对数属性)。

=的log(n!)

= Θ(N log n)的。

最后一步从Stirling's approximation开始。

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