算法分析大哦

时间:2014-03-01 21:59:13

标签: performance big-o code-analysis

我想弄清楚每行代码的大喔。我能够获得前2行,但第3行令人困惑。

sum <- 0                        // O(1)
for i <- 0 to n do              // O(n + 3)
for j <- 0 to i * i do          //
    for k <- 0 to j do          //
        sum <- sum + 1          //
        { k <- k + 1 }          //
    { j <- j + 1 }              //
{ i <- i + 1 }

1 个答案:

答案 0 :(得分:1)

sum <- 0                        // O(1)
for i <- 0 to n do              // O(n)
    for j <- 0 to i * i do      // O(n^2), this means that last/longest run (when i==n) of this inner loop will take n*n iterations
        for k <- 0 to j do      // O(n^2), last run of this loop (j==i*i==n^2) will take n^2 iterations
            sum <- sum + 1      // O(1)
            { k <- k + 1 }      // O(1)
        { j <- j + 1 }          // O(1)
    { i <- i + 1 }              // O(1)

你可以从内部(k)循环开始 - 什么是最长的运行?当j是最大? max J = maxI * maxI = n ^ 2,因此内(k)环的复杂性为O(N ^ 2)

K循环执行多少次?再次N ^ 2,因此J loop的复杂度为N ^ 2,这两个循环的总复杂度:O(J loop * O(K loop))= O(N ^ 2 * O(N ^ 2))= O( N R个4)

最后 - 我们有外部I循环,它的复杂性是O(N),所以我们有最终总数:

O(n * O(n ^ 2 * O(n ^ 2)))= O(n ^ 5)

所以,基本上我们正在检查“最差”情况,找出上渐近线,即 - 该算法的执行时间将以与n ^ 5增长相同的速度增长

请注意:

这个循环的复杂性:

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)

是N ^ 2

几乎相同的循环(但注意第二个条件):

for (i = 0; i < n; i++)
    for (j = 0; j < i; j++)

这也是N ^ 2的复杂性,即使它显然会运行得更快一点,但总体执行时间会随着N ^ 2的增长而增长