我想弄清楚每行代码的大喔。我能够获得前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 }
答案 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的增长而增长