大家好我试着计算这个函数的时间复杂度,但我真的不明白如何计算“for loop”的复杂性
01 int* f(int a[], int n) {
02 int i = 1;
03 int *s;
04 s = calloc(n, sizeof(int));
05 while (i < n) {
06 for (j=0; j < i; j++)
07 s[i] = s[i] + a[j];
08 i = i*2;
09 }
10 return s;
11 }
练习要求与数组
我认为第02,03,04行不是一个大问题,因为它们应该具有O(1)复杂度
对于while循环,如果我暂时搁置“for循环”,因为每次时间复杂度应为2^k<n --> k= log_2(n)
时,“i”乘以2
但是for循环怎么样?它应该被执行“i”次,但我怎么能用“n”来表达呢?
P.S:我怎么写数学符号?我在编辑器中找不到任何东西
答案 0 :(得分:2)
外循环执行 对于 所以你有1 + 2 + 4 + 8 ... +&lt; n。该总和小于2 * n。所以答案是O(n)。 其他一些人认为这是O(n * log(n)),但他们犯的错误是将外部行程计数乘以内部循环的最大行程计数。为了得到正确的答案,你需要考虑到内循环行程计数每次都加倍,所以后来的行程计算使之前的行程相形见绌。log(n)
次,i
取值1,2,4,8 ...... i
的每个值,内循环执行i
次。
答案 1 :(得分:2)
对于第一次迭代,内部循环将运行一次,第二次运行第二次,对于第三次迭代,内部循环将运行4次,依此类推。所以
2^0 + 2^1 + 2^2 + 2^3 +.....+2^i where 2^i < n
我们可以i
log
2^i < n
i=log2(n)
2^0 + 2^1 +...+2^(log2(n)) ie 2^0 + 2^1 + ...+ n
找到i < log2(n) and not i=log2(n).
n
但是
n/2
因此2^0 + 2^1...+n/2
的先前值为n/2
所以我们终于有了
mvn clean install
主导词是antigate-java-api-XX.jar
所以它的O(n / 2)是O(n)
答案 2 :(得分:1)
这实际上是个棘手的问题。从技术上讲,你的观察是正确的内循环最多执行n
次,因此看起来复杂度为O(n*log2(n))
。
但这不是真的正确。问题是,对于while
的第一次执行,内部for
循环执行一次,下次执行两次,下次执行四次等,直至n/2
(舍入为下一次幂二,最多n
)。总而言之,它总计为1+2+...n/2
O(n
)。即线性复杂性。