c - 如何计算算法的运行时间?

标签 c algorithm time-complexity big-o

我目前正在学习大 O 表示法的运行时间。我尝试计算一些代码的时间复杂度:

int i = 1;
int n = 3;  //this variable is unknown
int j;

while (i<=n)
{
    for (j = 1; j < i; j++)
        printf_s("*");
    j *= 2;
    i *= 3;
}

我认为这段代码的复杂度是 О(log n)。但即使它是正确的,我也无法解释为什么。

最佳答案

时间复杂度不是O(log n),而是O(n)

我们可以以结构化的方式计算它。首先我们检查内部循环:

for (j = 1; j < i; j++)
    printf_s("*");

这里j1迭代到i。因此,这意味着对于给定的 i,它将采取 i-1 步骤。

现在我们可以查看外循环,并且可以抽象出内循环:

while (i<=n)
{
    // ... i-1 steps ...
    j *= 2;
    i *= 3;
}

因此 while 循环的每次迭代,我们都会执行 i-1 步骤。此外,每次迭代i都会加倍,直到它大于n。因此我们可以说该算法的步数为:

log3 n
---
\       k
/      3  - 1
---
k=0

我们在这里使用k作为一个额外的变量,它从0开始并且每次递增。因此,它会计算我们执行 while 循环体的次数。它将在 3^k > n 时结束,因此我们将迭代 log3(n) 次,每次迭代内部循环都会重新开始3k-1 步。

以上总和相当于:

          log3 n
           ---
           \       k
-log3 n +  /      3
           ---
           k=0

上面是geometric series [wiki] ,等于:(1-3log3n)/(1-3),或者简化,它等于 < em>(nlog33-1)/2,因此 (n-1)/2。 p>

因此,步数总数的界限为:(n-1)/2 - log3n,或更简单地表述为O(n)

关于c - 如何计算算法的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56307518/

相关文章:

algorithm - 数字到包含重复项的序列的唯一排列映射

algorithm - 给定一组线段寻找面积最大的矩形

java - TreeMap Collection View 迭代器时间复杂度?

algorithm - 递归算法的时间复杂度

c - EVP 加密核心已转储

algorithm - 偶数能被二除多少次才变成奇数?

c - 如何在 Windows 上交叉编译 C 代码以使二进制文件也能在 Unix (Solaris/HPUX/Linux) 上运行?

java - 从母亲列表生成 child 列表

c++ - LCD 和 RTC_DS1307- 无法在液晶显示器上正确打印 1-9 位秒数

c - C 中复制字符串的确切方法是什么?