我发现很难分析算法的时间复杂度。以此算法为例,如何在O表示法中找到运行时间?
loop(n)
i = 1
while i ≤ n
j = 1
while j ≤ i
j = 2 ∗ j
i = i + 1
答案 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)