这是我需要分析的代码:
i = 1
while i < n
do
j = 0;
while j <= i
do
j = j + 1
i = 2i
所以,第一个循环应该运行log(2,n),最里面的循环应该运行log(2,n)*(i + 1),但我很确定这是错误的。 我如何使用theta符号来证明它?
答案 0 :(得分:3)
考虑这一点的直观方法是查看内部循环对外部循环变量i
的固定值执行了多少工作。它显然与 i 本身一样多。因此,如果 i 的值为256,那么您将多次执行j = j + 1
。
因此,完成的总工作量是 i 在外部循环执行中所采用的值的总和。该变量正在迅速增加以赶上 n 。由i = 2i
(它应该是i = 2*i
)给出的值将类似于:2, 4, 8, 16, ...
,因为我们在i = 1
时开始内循环的2次迭代。这是一个几何系列:a, ar, ar^2 ...
a = 1
和r = 2
。如您所知,最后一个字词将是n
,系列中会有log2 n
个字词。这是几何系列的简单总结。
对于此算法,最坏情况或最佳情况没有多大意义,因为在这种情况下,输入没有不同的排列,只是一个数字n
。当特定输入(例如,特定数字序列)影响算法的运行时间时,最佳情况或最坏情况是相关的。
然后,运行时间是sum of geometric series(a.(r^num_terms - 1)/(r-1)
):
T(n) = 2 + 4 + ... 2^(log2 n)
= 2 . (2^log2 n - 1)
= 2 . (n - 1)
⩽ 3n = O(n)
因此,你不能做超过n的常数倍的工作。因此,该算法的运行时间为O(n)
。
你不能做一些小于n的某个(其他)常数倍的工作,因为你必须经历内循环中的增量,如上所示。因此,该算法的运行时间也≥c.n,即它是Ω(n)
。
这意味着此算法的运行时间为Θ(n)
。
答案 1 :(得分:0)
你不能在最后的表达中使用i
;只有n
。
每次到达时,您都可以轻松看到内循环执行i
次。听起来你已经发现了i
可以拥有的不同价值观。因此,将这些值加起来,就可以得到总的工作量。