【发布时间】: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