这种最坏情况分析是否正确?

时间:2013-05-25 23:04:53

标签: algorithm complexity-theory

以下是代码:

int Outcome = 0;  
for (int i = 0; i < N; i++)  
    for (int j = i+2; j = 0; j--)  
        Outcome += i*j;

这是我的分析。由于第一行是赋值语句,因此只需要一个时间单位O(1)。第2行的细分为:1 + N + N = 2N + 2.第3行, 由于循环的内容是单个操作,循环及其块执行i + 1操作。这也是一个嵌套的for循环。最后,第4行只需要一个时间单位来执行。因此,用N表示该代码的大符号是O(N 2 )。

2 个答案:

答案 0 :(得分:1)

准确地说:如你所说,第4行是1次操作。对于特定的i,您执行内循环i+3次。因此,您的总操作数为

sum(0 <= i <= N-1 : i+3) 
    = 3N + sum(0 <= i <= N-1 : i) 
    = 3N + N(N-1) / 2
    = N^2/2 + 5N/2
    = O(N^2)

答案 1 :(得分:0)

你对最终效率等级的直觉是正确的,但它可能更严格。首先,您通常只需选择最昂贵的基本操作来计算分析。在这种情况下,它可能是最内层循环中的乘法,每次迭代执行一次。那么它被称为多少次?在最外层循环的第一次迭代中,内循环将迭代两次。在第二次外部迭代中,它将是三次,并且类似地直到N + 2(我假设内部循环条件意味着j >= 0)。所以这给我们留下了总结:

sum(2, 3, 4, 5, 6 ..., N+2)
= sum(1, 2, 3, 4 ..., N+2) - 1
= (N+2)(N+3)/2 - 1

哪个在O(N²)中(实际上因为你有这个特定的结果总是相同的,你可以说它在Θ(N²))。