【问题标题】:Is n log n = O(n) and is n log n = Omega(n)是 n log n = O(n) 并且是 n log n = Omega(n)
【发布时间】:2019-08-13 10:48:13
【问题描述】:

大家好,我已被问及上述 2 个问题,并解释了原因。我很困惑,我知道运行 O(nlogn) 算法所需的时间比线性 O(n) 算法增长得更快,但不太确定这些问题的答案。 我相当确定 n log n 不等于 O(n) 但我不太确定如何解释它。 (我认为我们不需要做一个确切的证明)

【问题讨论】:

  • 请使用cs.stackexchange.com 回答这个问题。显示这种关系的最简单方法是在 2d 平面上绘制这两个图。然后你会自动看到它的上限或下限。
  • 如果您的问题不是关于 .net 实现的问题,请考虑删除特定语言的标签。
  • 用实数测试方程。假设 O(n) 是 1,2,3,4,... 到无穷大。所以它是 n 的 1 倍。如果您查看等式 n log n 的左侧,当 log n 大于 1 时它会更大,当 log n 小于 1 时它会更小。
  • 两者都是错误的,因为它们不正确并且根本没有意义。 (苹果和橘子)在左边你有正确复杂度的纯函数,如果没有算法的上下文,你不能从一个到另一个。如果您要制定O(n*logn) = O(n),那将是错误的,但至少它是有意义的。
  • @Yoda:你误解了“复杂性”这个词。 O(n) 是一组函数。当我们说给定算法的时间复杂度在 O(n) 时,这意味着它的时间复杂度是一个函数,例如 3n+20,它是 O(n) 的一个元素。 (你说得对,写成 "f(n) = O(n)" 不是 quite 格式正确——严格来说,它应该是 "f(n) ∈ O(n) " -- 但在这方面使用 "=" 是很常见的,通常不会引起任何混淆。)

标签: loops big-o computer-science complexity-theory


【解决方案1】:

声明:n*log(n) 不是 O(n) 证明:证明是矛盾的。假设n*log(n)O(n)。然后根据O 的定义,必须存在常量n0c,这样对于所有n > n0n*log(n) <= c * n。两边除以n 得到log(n) <= c。但是,没有常数 c 使得所有 n > n0log(n) <= c;考虑序列n = 2^0, 2^1, 2^2, …, 2^k, …这是一个矛盾;所以,这个假设是不正确的。换句话说,n*log(n) 不能是O(n)

声明:n*log(n)Omega(n) 证明:证明是直接的。选择n0 = 1c = 1。然后n*log(n) >= n = 1*n = c*n,根据需要。

【讨论】:

    【解决方案2】:

    简单回答:

    忽略一些细节,您可以说 f(n) = O(g(n)) 意味着 f(n) = g(n)。 (我们也可以将其扩展到 Theta、little o 和 little omega)。

    所以基本上,如果你有直觉认为 nlogn 是一个比 n 更大的函数,那么你可以说:n log n = Omega(n) 或等效地 n = O(n log n)。但反之则不然。

    因此,nlogn=O(n) 是错误的说法。

    复杂的答案:

    如果你想证明 f(n)=O(g(n)),那么你需要找到满足 Big-O 定义的某些常数。你可以查一下,但我不会详细说明。

    但是,如果你想证明 f(n) 不在 O(g(n)) 中,那么简单地说你想证明 f(n) g(n) 的情况。现在,您可以将 严格较大(较小) 比较表示为 little-o 或 little-omega。因此,要证明 f(n) 不在 O(g(n)) 中,您实际上应该证明 f(n) > g(n) 转换为 f(n) = little-omega(g(n)) .要证明小 o 和小 omega 关系,您必须使用限制。

    详细了解这些形式证明的一个很好的参考是 Cormen 的“Introduction to Algorithms, Third Edition”。

    【讨论】:

      【解决方案3】:

      n logn 不是O(n),因为它比n 增长得更快,这意味着n 不是它的上限。

      另一方面,n log nΩ(n),因为 n 是它的下限。 Ω的定义是for f(n)=Ω(g(n)) means that for any c there exists an n such that 0<=cg(n)<=f(n)

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多