我如何计算此函数的时间复杂度?

时间:2016-06-21 14:40:42

标签: c time-complexity

大家好我试着计算这个函数的时间复杂度,但我真的不明白如何计算“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:我怎么写数学符号?我在编辑器中找不到任何东西

3 个答案:

答案 0 :(得分:2)

外循环执行log(n)次,i取值1,2,4,8 ......

对于i的每个值,内循环执行i次。

所以你有1 + 2 + 4 + 8 ... +&lt; n。该总和小于2 * n。所以答案是O(n)。

其他一些人认为这是O(n * log(n)),但他们犯的错误是将外部行程计数乘以内部循环的最大行程计数。为了得到正确的答案,你需要考虑到内循环行程计数每次都加倍,所以后来的行程计算使之前的行程相形见绌。

答案 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)。即线性复杂性。