我有一些问题,我正试图找到大O.令我困惑的是(N * N)问题:
for (i=1, sum=0, i <= N; i++) {
for (j=1; j <= N*N; j++) {
sum++;
}
}
我猜它是O(N ^ 3)因为(N * N)可能代表两个循环。
for (i=1, sum=0, i <= N; i++) {
for (j=1; j <= N*N; j++) {
for (k=1; k<=j; k++) {
sum++;
}
}
}
如果是,那么这个将是O(N ^ 4)?
答案 0 :(得分:5)
for (i=1, sum=0, i <= N; i++) { // loop over i
for (j=1; j <= N*N; j++) { // loop over j, no dependency
sum++;
}
}
j
上的内部循环独立于i
,并且具有复杂性O(N*N)
。
外循环执行N
次,因此总共O(N^3)
。
for (i=1, sum=0, i <= N; i++) { // loop over i
for (j=1; j <= N*N; j++) { // loop over j, no dependency
for (k=1; k<=j; k++) { // loop over k, dependent on j
sum++;
}
}
}
k
上的循环取决于j
。 j
在整数N*N
上独立循环。
总和1 + 2 + ... + N * N
等于(N * N + 1) * N * N / 2
O(N^4)
。
再一次,i
上的循环重复N
次,因此总复杂度为O(N^5)
。
为了计算大O,总是从最里面的循环开始并处理依赖关系!
答案 1 :(得分:1)
您可以使用Sigma表示法有条不紊地正式着手:
答案 2 :(得分:0)
我认为这是O(N ^ 5)。
第一个(外部)循环是O(N)。
第二个是O(N ^ 2)。
最后一个也是O(N ^ 2)。