如何回答这些Big-O家庭作业的挑战?

时间:2015-07-26 20:14:55

标签: algorithm big-o time-complexity complexity-theory

我想知道我是否有正确的大O问题:

  

确定以下的Big-O:

a.    for (i = 0; i < N; i++){
         sequence of statements
    }
  for (j = 0; j < 1000000000*M; j++){
      sequence of statements
     } 

这是O(NM)正确吗?

b.    for (i = 0; i < N; i++) {
          for (j = 0; j < i; j++) {
              sequence of statements
          }
     }
     for (k = 0; k < N; k++) {
        sequence of statements
     }

这是O(n ^ 4)吗?

c.    for (i = 0; i < N; i++) {
          for (j = i; j < i*i; j++) {
             sequence of statements
          }

我有点坚持这个...... O(N ^ 5)?或O(N ^ 4)?

1 个答案:

答案 0 :(得分:2)

a)不,第一个是不正确的,因为两个for循环都是独立的。第一个for循环迭代N次,而第二个for循环迭代1000000000 * M次。

如果f1(n)= O(g1(n))且f2(n)= O(g2(n)),则f1 + f2 = O(| g1 | + | g2 |)。

检查this Wikipedia link on Big O notation以了解上述原因。

  

因此,整体时间复杂度= O(| N | + | M |)。

b)嵌套循环的时间复杂度为1 + 2 + ... + N = N *(N + 1)/ 2 = O(N 2 )。

并且,k变量引导循环的复杂度是O(N)。

  

因此,在这种情况下,总体时间复杂度为O(N 2 )。

c)第三种情况有点复杂。

当N = 2时,两个循环的总迭代次数= 0.

当N = 3时,两个循环的总迭代次数= 2.

当N = 4时,两个循环的总迭代次数= 2 + 6 = 8。

当N = 5时,两个循环的总迭代次数= 2 + 8 + 12 = 22。

...

当N = N(等于)时,两个循环的总迭代次数= 2 + 8 + 22 + ... +(N-1)*(N-2)=

所以,总复杂度

= 2 + 8 + 22 + ... + (N^2 - 3*N + 2)   
= 1/3 * (N-2) * (N-1) * N 

检查this link以了解其来源

= O(N^3).
  

因此,总时间复杂度= O(N 3 )。