【问题标题】:Difficulty showing run-time is bigOmega(g(n))显示运行时的困难是 bigOmega(g(n))
【发布时间】:2014-02-06 04:00:17
【问题描述】:

我在使用以下算法时遇到了一些问题:

for (int i = 1; i < n; i = 2i)
    for (int j = i; j < n; j++)
        // do something (const time)

所以显示运行时为 O(nlogn) 并不难 - 但我不确定如何显示它是 Big Omega(nlogn)!直觉上,我认为一定是这样,因为对于给定的 n,时间复杂度在最佳/最坏情况之间没有变化。

任何建议将不胜感激!

【问题讨论】:

  • 如果你能找到一个常量c1 来为一些大于0 的n0 显示f(n) &lt; c1*nlogn,那么找到一个c2 来为一些大于0 的n0 显示c2*nlogn &lt; f(n) 应该是微不足道的
  • 对 - 我可以说内部循环必须执行至少 n/2 次,所以 c 是 1/2?
  • 内部循环执行n + (n-2) + (n-4) + (n-8)... 次,我们知道我们将有log(n)(n-i) 总和,所以如果我们把它分开(感谢交换性/关联性)我们应该显示内部循环执行n + n + n ... - 2 - 4 - 8 -...,因此我们有n*logn 的计数n's,我们将2^ii = 1 to logn 相加,等于2^(logn+1) -1,我们可以将其减少为2n-1。使用此信息设置不等式并找到 c2
  • 好吧..所以根据你的计算,这个算法实际上是 O(n) 而不是 O(nlogn)?
  • 不 - 我的数学是(非常轻微的)。我将把它移到上一篇文章之前应该有的答案。

标签: algorithm complexity-theory


【解决方案1】:

在此算法中,没有最佳或最差执行路径:给定n 的值,执行路径是固定的。所以最好和最坏的情况是一样的。

一个好的经验法则是,如果算法的控制流不是数据驱动的,那么最好和最坏的情况是相同的。

我所说的数据驱动的一个例子是快速排序算法的实现,其中始终选择枢轴作为数组的第一个元素。有时第一个元素会完美地分割其余数据(最佳情况),有时会是最大值或最小值(最坏情况)。

【讨论】:

  • 是的,这是有道理的,但假设我们想要更严格地证明这一点。我们真的必须为运行时派生一个显式函数吗?在这种情况下会是什么样子?
  • 我认为 f(n) 是 (j - i) 从 1 到 logn 的总和,但我不知道如何进一步证明它实际上是 Big Omega的 nlogn
  • @codeMonkey17 这是 100% 严格的。你已经给出了为什么最坏的情况是 O(n log n) 的论据。您可以通过说控制流完全由 n 的值决定来扩展该论点。因此最好的情况是 Omega(n log n)。
【解决方案2】:

要了解为什么这是 O(nlogn) 背后的直觉,我们需要做的就是查看内部循环执行了多少次。

正如您所说,外部循环执行 logn 次(很容易看到,因为在不等式停止成立之前,您只能将 i logn 加倍)

所以对于内部循环,我们可以看到每次i 发生变化时它执行的步数都不同

第一次迭代,它执行n-1 次(因为i1 开始)

下一次迭代,n-2

第三次迭代,n-4

我们可以看到模式是(n-1) + (n-2) + (n-4) + (n-8) ...

现在,让我们一起分离出n's。我们有多少(n-k) 添加?通过知道外循环执行了多少次,我们拥有其中的logn

所以n + n + n + n ... - 1 - 2 - 4 - 8...可以被认为是nlogn - 1 - 2 - 4 - 8 ...

现在,我们如何证明这可以进一步减少?那么我们的减法总数是logn减法(感谢外循环),我们知道减法的大小每次都加倍。另一种看待它的方式是来自i = 0 to logn2^i 的总和。

现在一个标准的 CS 公式是 sum of i = 0 to n2^i2^(n+1) - 1。这用于显示完整二叉树中的最大节点数,您可以通过归纳来证明。

所以我们将公式中的logn 替换为n,得到nlogn - (2^(logn+1)- 1)。但我们还没有完成。我们可以证明2^(logn+1) = 2*2^logn=2*n。所以最后,我们得到了nlogn - 2n + 1。此时,设置您的不等式并找到c2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多