【问题标题】:Cannot find the time complexity of this C code?找不到这段 C 代码的时间复杂度?
【发布时间】:2016-02-13 11:41:15
【问题描述】:

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

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

【问题讨论】:

  • 什么是运行时或大 O 复杂度?
  • @juanchopanza 哦,不知道这是两个不同的东西。比如,O(logn) 或 O(n^2) 以及这种计算,如果它对你有任何意义的话。很抱歉造成混乱。
  • 一个好的开始可能是格式化代码,使其更具可读性。在 C 中,空格并不重要(在字符串和字符文字之外),所以缩进之类的东西对编译器来说并不重要。不过,这对人类非常很重要。
  • @JoachimPileborg 我的错 :) 已修复。
  • 如果您不了解大复杂性和运行时之间的区别,我怀疑有人能给出对您有意义的答案。程序执行时间受很多因素影响,包括算法复杂度。所以我投票关闭线程。

标签: c runtime big-o time-complexity


【解决方案1】:

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

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

第三个循环是嵌套循环迭代j 次,嵌套循环迭代j1 次,总共j * (j - 1) / 2 次。这个的时间复杂度是O(log(n)^2),并且在之前的阶段中占主导地位。

这个函数的整体时间复杂度是O(log(n)^2),而空间复杂度是O(log(n))

【讨论】:

  • 终于有人有用了。非常感激。谢谢。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2021-06-23
  • 2021-10-23
  • 2018-03-19
  • 1970-01-01
  • 2023-02-26
相关资源
最近更新 更多