【问题标题】:what will be the time complexity (in bigO notation)?时间复杂度是多少(大 O 表示法)?
【发布时间】:2020-05-12 10:42:46
【问题描述】:

我无法计算这个程序的时间复杂度。

`const int n=1e6+5;
 int prime[n];
 void pre()
 {
    prime[1]=1;
    for(int i=2;i<n;i++)
    {
        if(!prime[i])
        {
            for(int j=2;i*j<n;j++)
            {
                 prime[i*j]=1;
            }
         }
     }
 }`

你能用大 O 表示法告诉这个程序的时间复杂度是多少

【问题讨论】:

  • 看起来像埃拉托色尼的筛子
  • 二次复杂度。大概是作业,但现在你得到了答案,你能解释一下吗?
  • @john 不正确,它不是二次的。
  • @john 少看内部循环控制:i*j&lt;n

标签: c++ algorithm time-complexity


【解决方案1】:

对于外循环的每次迭代,内循环的迭代次数与n/i 成正比。因此,迭代的总数类似于n/2 + n/3 + … + n/n。我们可以将 n 分解为n * (1/2 + 1/3 + … + 1/n)。我们认识到括号中的内容基本上是直到项 n 的调和级数,并且调和级数的部分和在 n 中具有对数渐近增长(参见 Wikipedia here)。

因此,看起来内循环的总迭代次数增加了n * log(n)。内循环的每次迭代都会做恒定的工作,而内循环的外部每次外循环的迭代都会做恒定的工作。因此,我们得到了像a * n + b * n * log(n) 这样的工作总量,即O(n log n)

现在这可能有点草率,因为从技术上讲,将两个数字相乘并不是“免费”的操作。如果我们忽略这一点并假设我们正在谈论的是现实计算机,其中所有乘法都需要大约相同的时间而不管大小(固定大小的变量),那么这很好。确实,如果手动执行此操作,您可能需要考虑乘法的成本,这可能与数字大小的对数成正比。这可能会添加一个额外的对数项,给出类似O(n log^2 n) 之类的东西。 YMMV。

【讨论】:

    【解决方案2】:

    一步一步的数学公式:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多