【问题标题】:Can all algorithms be described as O(1)?所有算法都可以描述为 O(1) 吗?
【发布时间】:2017-03-10 17:03:55
【问题描述】:

我读到大 O 符号的正式定义是:

如果存在常数 c 和 n0,则认为 T(n) 为 O(f(n)),其中对于所有 n > n0,T(n)

但我想知道,这是否意味着如果一个算法是 O(n),它也必须是 O(n^2) 和 O(n^3) 等?

当然,如果存在一个常数 c 和 n0,其中 T(n) n0。还必须有一个常数 c 和 n0,其中 T(n) n0。

实际上,如果选择 c = infinity,每个算法都可以说是 O(1),因为任何 T(n) 都将是

我知道这完全违背了大 O 符号的目的。但我想知道我哪里出错了,我错过了什么。

【问题讨论】:

  • c=infinity 不是 c 的有效选择。我们正在研究实数,或者可能是整数或自然数。这些系统中没有一个包含无穷大。
  • math.stackexchange.com/questions/36289/is-infinity-a-number 可能有助于理解“无穷大不是数字”。
  • @Synia:是的。您可能还想查看相关的符号,尤其是限制性更强的 Big-Theta。
  • 函数的顺序是最小的上界。如果你有一个 O(n) 函数,它也是 O(n^2) 和 O(e^n),但 n 是最小上限。 “存在 c, n0 st T(n) n0”意味着“存在 c, n0 st T(n) n0" 成立,但你不能反过来说。函数阶数的定义还要求 c 是一个常数,而无穷大不是。
  • @MidTwo:没有计划。我喜欢以我的自动生成名称结尾的 2、3、5、7、11 序列。更有辨识度可能会很好,但我对此并没有强烈的渴望。

标签: algorithm big-o asymptotic-complexity


【解决方案1】:

O(n) 是函数的集合,当我们说“T(n) is O(n)”甚至“T(n) = O(n)”时,我们只是马虎,应该更正确地说“T(n) O(n)”。

正如你所确定的,O(n^2) 是 O(n) 的超集,O(n^3) 是 O(n^2) 的超集,所以如果 T(n) 在 O (n),那么它也在O(n^2)和O(n^3)之间。

第二部分你错了:无穷大不是一个实数,所以你不能把它当作一个常数来推断一切都在 O(1) 中。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2016-04-06
    • 1970-01-01
    • 2012-07-18
    • 2021-10-06
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多