#include <stdio.h>
int F(int L[], int p, int q) {
if (p < q) {
int r, f1, f2;
r = (p + q) / 2;
f1 = 2 * F(L, p, r);
f2 = 2 * F(L, r + 1, q);
return f1 + f2;
} else if (p == q) {
return L[p] * L[p];
}else{
return 0;
}
}
int main(void) {
int arr[8] = {1,2,3,4,5,6,7};
printf("%d", F(arr, 0, 7));
}
有人说这个代码的时间复杂度是O(n)
。
我完全不明白...
不是O(logN)
吗???
1条答案
按热度按时间ymdaylpp1#
说明:
程序取一个一定大小的范围(例如
q - p + 1
),将该范围分成两半,然后在这两半范围上递归调用函数。这个过程一直持续到范围大小为1(即
p == q
),然后不再递归。示例:考虑大小为8的起始范围(例如
p=0, q=7
),则您将得到因此,范围大小大于1的7个调用(即1 + 2 + 4)和范围大小等于1的8个调用。总共15个调用,这几乎是起始范围大小的2倍。
如果范围大小是2的幂,可以归纳为
因此,当范围大小是2的幂时,将正好有
2 * rangesize - 1
函数调用。这就是大O复杂度O(N)。
"想试试吗"
输出: