我很难弄清楚如何计算某些代码的时间复杂度。我知道Big O的基础知识,虽然我不能完全理解如何计算。
这是一个我无法解决的例子。希望你能:
void f(int n) {
int j, s;
for (j = 0, s = 1; s < n; j++, s*=2)
printf(“!”);
double values[j];
for (int k = 0; k < j; k++)
values[k] = 0;
while (j--)
for (int k = 1; k < j; k++)
values[k] += 1.0 / k;
}
运行时间是什么?我想要一个解释:)
答案 0 :(得分:2)
第一个循环迭代log2(n)
次,计算j
,n
的最高位的顺序。复杂性O(log(n))
。
第二个循环初始化一个大小为j
的数组:时间和空间复杂度O(log(n))
。
第三个循环是一个嵌套循环,迭代j
次,嵌套循环迭代j
到1
次,总共j * (j - 1) / 2
次。时间复杂度为O(log(n)^2)
,并且在前几个阶段占主导地位。
此函数的总体时间复杂度为O(log(n)^2)
,而空间复杂度为O(log(n))
。