【问题标题】:Time complexity of this code confusing me这段代码的时间复杂度让我很困惑
【发布时间】:2023-01-12 16:33:35
【问题描述】:

我正在努力理解计算时间复杂度的概念。我在 C 中有这段代码,为什么时间复杂度是 O(n) 而不是 O(n log n)? 第一个循环最多运行 3 次迭代,外部 for 循环是对数复杂度,并且它的每次迭代都是线性时间。

int f2 (int n)
{
    int j, k, cnt=0;
    do 
    {
        ++n;
    } while (n%3);

    for (j=n; j>0; j/=3)
    {
        k=j;
        while (k>0)
        {
            cnt++;
            k-=3;
        }
    }

    return cnt;
}

为什么我们忽略日志时间?

【问题讨论】:

  • 计算总和 n + n/3 + n/9 + n/27 + ... +1。
  • 好的,当算法运行 O (n log n) 时?我怎样才能改进这些计算?
  • 不知道你所说的改进是什么意思。您进行此计算并找出该算法的复杂性。对于不同的算法,您需要不同的计算。

标签: algorithm time-complexity big-o


【解决方案1】:

你程序的时间复杂度是O(n)。 因为计算的总数是:log(n)/log(3) + 2 * (n/3 + n/9 + n/27 + ... < log(n) + n/2 < 2*n

【讨论】:

    【解决方案2】:
    T = (n+n/3+n/9+...+1)
    3*T - T = 3*n-1
    T = 1.5*n-0.5
    

    这是 O(n)

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2022-07-06
      • 2013-11-18
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多