我想知道我是否有正确的大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)?
答案 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 )。