找不到这段 C 代码的时间复杂度?

标签 c runtime big-o time-complexity

我很难弄清楚如何计算某些代码的时间复杂度。我知道 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;
}

运行时间是多少?我想要一个解释:)

最佳答案

第一个循环迭代 log2(n) 次,计算 j,即 n 的最高位的顺序。复杂度O(log(n))

第二个循环初始化大小为 j 的数组:时间和空间复杂度 O(log(n))

第三个循环是一个嵌套循环,迭代 j 次,其中嵌套循环迭代 j1 次,总共 >j * (j - 1)/2 次。此过程的时间复杂度为 O(log(n)^2),并且主导了前面的阶段。

该函数的总体时间复杂度为O(log(n)^2),而空间复杂度为O(log(n)) p>

关于找不到这段 C 代码的时间复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35379389/

相关文章:

C语言 : lookup in char array

arrays - 埃拉托色尼筛法

EXCEL VBA : calling an event with onclick property of a button which is being created on the fly

algorithm - 寻找 f(n) 的上限

algorithm - 如何计算这个函数的增长率 : T(n) = 2T(n^(1/2)) + 2(n^(1/2))

c - 为什么函数存在于.o文件中,但不存在于.so文件中?

objective-c - 在 Objective-C 中打印 &object 和 object 的区别

Stm32F103 Arm 运行时系统,GNAT Ada 编译器

c# - 将对象转换为集合

java - 优化算法以在二维道路(线)中找到交点