【问题标题】:Where O(n^2) comes from in O(n^2 * log n)?在 O(n^2 * log n) 中 O(n^2) 来自哪里?
【发布时间】:2018-06-03 15:40:23
【问题描述】:

你能解释一下 O(n^2 * log n) 的样子吗?我明白 O(n * log n)

s=0
for(i=0; i<n; i++)
{
    for (j=1; j<n; j *= 2)
    {
        s=s+i*j;
    }

    s=s+1
}

当外循环从 1 运行到 n 是 O(n) 并且内循环每个外循环重复 log(n) 次时,例如 j *= 2。我也明白 O(n^2) 确实(性能与输入数据大小的平方成正比)

s=0
for(i=0; i<n; i++)
{
    for (j=0; j<n; j++)
    {
        s=s+i*j;
    }

    s=s+1
}

但什么是O(n^2 * log n)?可以举个例子吗。

【问题讨论】:

  • 只需将另一个从 0 到 n 的外部循环添加到您的第一个示例中。那是 n * n * log n = n^2 * log n。
  • 或者把for(i=0;i&lt;n; i++)改成for(i=0; i&lt;n*n; i++)
  • @ScottHunter 谢谢
  • 您的第一个代码不是 O(n * logn) 而是 O(infinity),因为内部循环永远不会终止(j 永远不会从 0 更改)。您需要从 1 开始 j 来修复它。
  • @interjay 感谢您向我解释,我也编辑了我的问题

标签: algorithm data-structures time-complexity big-o


【解决方案1】:

你只需要在外面添加一个 for 循环。这使得它 O(n^2 * log n) 因为你重复 O(n * log n) n-times

for(int k=0; k<n; k++)
{
    s=0
    for(i=0; i<n; i++)
    {
        for (j=0; j<n; j *= 2)
        {
            s=s+i*j;
        }

        s=s+1
    }
}

【讨论】:

  • 非常感谢您的澄清
【解决方案2】:
for(i=0; i<n; i++)
{
    for (int ij = 0; ij < n; ++ik) {
        for (j=0; j < ij; j *= 2)
        {
            s=s+i*j;
        }
    }
    s=s+1
}

这样想:

  1. 我的输入是 n。
  2. 在第一个循环中,我从n 遍历每个元素,所以我的复杂度是n
  3. 所以这意味着在第二个循环中我遍历每个元素ijn 次,我的复杂性变为n*n
  4. 在第三个循环中,我正在做对数遍历,它访问logn 元素。但是每个对数遍历都从之前的循环中执行了n*n 次,所以它变成了n*n*logn

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2012-11-22
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多