【问题标题】:Constants in the formal definition of Big OBig O 正式定义中的常量
【发布时间】:2014-10-28 17:00:59
【问题描述】:

我正在修改 Big O 和其他相关边界的正式定义,但有些事情让我很不爽。在我正在阅读的书中 (Skiena),大 O 被定义为:

f(n) = O(g(n)) 当存在一个常数 c 使得 f(n) 对于 n > n0 的某个值总是

这对我来说通常是有意义的。我们只关心足够大的 n 值,以至于增长率实际上很重要。但是为什么用 c 乘以 g(n) 呢?似乎我可以为 c 选择一个非常大的值,并通过消除较小 g(n) 值的大小来使整个事情变得任意。

辅助问题:选择将算法分类为复杂性类时,是拇指的一般规则,只需根据大O的定义选择仍然保持的最低增长类?根据定义,将恒定时间算法分类为 O(n!) 似乎是有效的,因为 f(n) 将

谢谢!

【问题讨论】:

  • Big O 表示法只是描述了内存/时间如何随问题大小而变化。它不会告诉您实际时间等。您选择了最大的。例如 n^2 超过 n 等。
  • 我不确定这是否能回答我的问题。是的,它告诉您时间如何随输入大小而变化,但是它应该提供一个上限。因此,您需要选择最严格的上限吗?否则它根本不代表增长。我仍然不确定常量 c 是如何影响它的。
  • 否 - 它描述了增长 - 即图形的形状。 c 只是其中一个轴的拉伸值。不改变图形的形状
  • O(n) = O(n^2) = O(n!),根据定义和严格的从左到右阅读特殊的“=”含义。是的,这没有任何价值。然而,有时确定某事物是 O(n^2) 比确定它是 O(n^1.987) 更容易,这允许在保持足够准确的同时有点懒惰。
  • 对于未来的读者,这可能会有所帮助:stackoverflow.com/questions/29954109/…

标签: algorithm big-o asymptotic-complexity


【解决方案1】:

您可以将g(n) 与任意常数c 相乘,因为您想要的函数只是一个常数cf(n) 相距的因子。简单来说,您基于n 执行分析,而不是常量,所以您关心的是这些函数如何仅根据输入大小而变化。例如,当您有 n^3n 时,您无法选择 c 其中 c*n >= n^3 除非 c >= n^2 不再恒定,因此 g(n) 将与 @ 逃离 f(n) 987654333@.

正如 Ed 提到的,此分析不会为您提供准确的运行时间,而是根据输入 n增长率。如果g(n)f(n) 总是(最多)彼此相距不变的因素,那么两者的增长率将是相同的。

在这种时间复杂度分析中,我们并不真正关心常量,这在大多数情况下是可以的在某些情况下您实际上应该考虑到它。例如,如果您正在处理小型集合,则 O(n^2) 算法实际上可能比 O(nlogn) 更快,因为有常数。

第二个问题:是的,这是 BigO 的常见问题,您可以使用任意函数,这就是为什么我们通常会尝试找到“最紧密”的g(n),否则就没有什么了点找到它。这也是为什么 *BigThetaBigO 更有用的原因,因为它告诉您一个紧密的界限,而不是一个上限。

【讨论】:

  • Big Theta 是否提供更严格的上限?还是它只是给出一个上限和下限,从而为您提供一个更具代表性的增长范围?
  • 它为您提供了上限和下限,这意味着它是一个紧密的界限(上限 == 下限)。当 BigO == BigOmega 时存在大 theta,不涉及范围。
  • 好的,让我试着在 Ed 治愈评论的帮助下弄清楚这一点。 c 的值无关紧要,因为它不会改变图形的形状(当您绘制 g(n) 时),它基本上只是将线进一步向上移动 y 轴。因此,当 y 值以相同的速度增加时,增长率仍然是相同的。这对我来说很有意义,但为什么我需要 c 呢?是为了弥补我们忽略 f(n) 中的常数的事实吗?因此,如果我们不引入 c,f(n) 可能会在图上看起来更大?
  • 它不会向上移动它。它拉伸轴。 c 只是为了使陈述正确。需要数学阅读
  • 当我重新阅读 Big theta 的定义时,我终于明白了。加上一些常数 c1 并减去一些常数 c2,g(n) 提供了 f(n) 的上限和下限。只有当增长率与 n 变大时,才会出现偏离路线的情况!所以 Big Theta 基本上是说 g(n) 不是任意的上限或下限,它是增长率,因此人们说它是一个紧密的界限。我觉得我在矩阵中,我能看到的只有绿色滚动代码:P
【解决方案2】:

在选择将算法分类为复杂性类时,是拇指的一般规则,只需根据大O的定义选择仍然保存的最低增长类?

就符号而言,就像我们有 big-O 表示上限一样,我们有 big-Omega 表示下限,而 big-Theta 表示您能够证明上限和下限匹配。

https://en.wikipedia.org/wiki/Big_O_notation#The_Knuth_definition

假设 Knuth 的引用是正确的,那么我们可以说,你并不是唯一一个假设涉及紧密渐近界的结果更有用的人 :) 有时人们会说 big-O,而实际上他们想说的是 big-Theta,但实际上是其他一些有时他们只是不在乎或没有设法找到下限。

似乎我可以为 c 选择一个非常大的值,并通过消除较小 g(n) 值的大小来使整个事情变得任意。

对于具有不同渐近增长率的函数,c 无关紧要。不管你选择多大或多小c,当更快的增长功能赶上来时,都会有一个n。当事物具有相同的增长率时,常数因子允许您忽略常数乘数。例如,对于 big-O,f(x) = 2xg(x) = 3x 的增长率相同。

【讨论】:

  • 你的评论“不管你选择c多大或多小,当增长更快的函数赶上来时都会有一个n”,非常有用。谢谢!
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多