c - C语言的简单时间复杂度

标签 c recursion time-complexity

你们能告诉我f3时间复杂度是多少吗? 我在想 sqrt(n).log(n) 但官方答案是 n。 有什么想法吗?

#define PARTS 4

void f3(int n) {
    if (n < 4)
        return;

    for (int i = 0; i * i < n; i++)
        printf("%d", i);

    for (int i = 0; i < PARTS; i++)
        f3(n / PARTS);
}

最佳答案

复杂度取决于 printf 的复杂度:如果您可以假设 printf("%d",i) 的成本恒定,那么时间复杂度似乎为为O(N + k.sqrt(N)),其中 k=-1。由于 sqrt(N)N 主导,因此可以简化为 O(N)

        cost(4*N) = 4*cost(N) + sqrt(4*N)
4*N + k*sqrt(4*N) = 4*N + 4*k*sqrt(N) + 2*sqrt(N)
              2*k = 4*k+2
                k = -1

如果printf("%d",i)的复杂度为log(i),考虑到转换产生的位数>i 以 10 为基数,整体复杂度更难评估:k.sqrt(N) 变为 k.log(N).sqrt(N),仍然以N为主。

关于c - C语言的简单时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49308723/

相关文章:

c - LD_PRELOAD 和 clone()

c - 原子引用计数共享不可变数据是否需要内存屏障?

C : Recursive Function to Iterative

.net - HashSet 是 Enumerable.ElementAt<TSource> O(1) 吗?

python - 如何在 Python 中组合逻辑门 NOT in list.count((x, not y))

c++ - 生成表单(Windows 表单)的控制台应用程序?

编译mruby

JavaScript 递归反向字符串

scala - 在对象而非类上定义时,方法是尾部递归

algorithm - Sieve of Eratosthenes 算法的时间复杂度