【问题标题】:Help with big O notation大 O 符号的帮助
【发布时间】:2010-07-27 19:24:55
【问题描述】:

我在试图掌握大 O 符号的概念时遇到了一些问题。所以,根据定义,大 O 如下,T(n) ∈ O(G(n)) if T(n) <= G(n) * C

既然常数“C”可以是任何大于 0 的整数,那么下面这个例子不也是正确的吗?

例子:

n log n ∈ O(log n)
n log n <= log n * c

其中 C 等于 n 的值。

我知道答案是 n log n ∉ O(log n),但我不明白为什么 C 可以是任何常数。

提前感谢您的帮助:D

【问题讨论】:

  • @Jacob,很明显。但这并不是一个坏问题。 bigO 是每个程序员都应该了解的。
  • 不是作业,只是在期中考试前澄清一些事情
  • @Steven,我希望他们在我上大学时拥有 intarwebs(特别是 SO)。本来可以在地牢中节省很多时间(科学大楼地下室的 CS 图书馆)。祝你考试顺利!
  • 感谢拜伦,再次感谢大家给出如此好的答案:D

标签: algorithm time-complexity big-o


【解决方案1】:

c 就是这样,一个常量。这意味着你不能说“让 c 是 n 的值”,因为你必须先选择一些 c,然后让比较对所有 n 都成立。

换句话说,为了使某个 T(n) 为 O(G(n)),必须存在 no 常数 c 使得 G(n)*c 大于 T (n) 对于所有 n。

因此 n log n 不是 O(log n),因为无论您选择什么常数,n > c 都会导致 n log n 大于 c log n。

【讨论】:

    【解决方案2】:

    让我重复你的话。

    c 可以是任何常量

    这意味着c不能依赖n。

    【讨论】:

      【解决方案3】:

      这个想法是不等式适用于任何 n 和一个 固定 c。因此,虽然您可能会找到某个 c 使得 n log n n),但您可以轻松找到它不存在的其他 n'(即 n'>c)。

      【讨论】:

      • 我认为这种误解的根源是您在 some 点选择了 c。但这是每个函数类一次,而不是每个 n 一次。
      【解决方案4】:

      首先,如果 n=C 则 C 不是常数。而且在大多数现实世界的算法中,C 很小,因此对于 n 的典型值,大 O 部分通常占主导地位。

      但是大 O 复杂度与算法的效率有关,对于大 n,尤其是当 n 接近无穷大时。换句话说,它告诉您算法的可扩展性:给定算法处理非常大或加倍的工作负载的能力。

      如果您知道 n 总是很小,那么大 O 复杂度就不是那么重要了,您应该专注于算法所需的挂钟时间。此外,如果您在具有相同大 O 复杂度(例如 O(n log n))的两种算法之间进行选择,通常一种优于另一种(例如,随机枢轴快速排序通常优于二进制堆排序)。

      【讨论】:

      • “在大多数现实世界的算法中,c 很小,因此对于 n 的典型值,大 O 部分通常占主导地位”:这是令人困惑的一个 c - 用于确定某个算法的常数O(something) - 使用完全不同的 c,即程序运行时的常数因子(即 runtime=3X+c)。这些不一样。
      • OP 使用“C”作为乘法因子,而不是常数相加项。我只是使用相同的语言(对不起小写的“c”)。
      • 我不是这个意思。而且,实际上,在原始问题中使用了小写的“c”。仔细阅读我选择的句子,您会发现它不能指代 OP 帖子中的任意乘法常数 - 因为 OP 的“c”是一个选择的反例,而不是“现实世界算法”的一个因素。 “c 在大多数现实世界的算法中都很小”是指运行时系数。
      • @Borealid:不,我仍然不明白你为什么要说一个加法“+c”。
      • 如果一个算法对 n 个元素执行 n+k 操作,它是 O(n)。你证明它是 O(n) 的方法是说“不存在 X 使得所有 n 的 Xn > j*(n+k)”。当您说“在大多数现实世界的算法中,C 很小”时,您*必须 引用的变量是现实世界运行时间的常数因子(上面的k)。它不能是存在变量(上面的X)也不是存在常数(j),因为“真实世界的算法”不存在这些。但是你说“如果 n=C 那么 C 不是常数”。因此,在你的前两句话的某个地方,你会感到困惑。
      【解决方案5】:

      在定义中,您应该仅通过 T 和 G 本身来确定 C。这就是常数 C 的含义。所以 C 不应该依赖于它们的输入。所以你可以不考虑C = n

      【讨论】:

        【解决方案6】:

        在表达式 n log n 中,您无法将外部 n 与 C 进行比较,就像您正在做的那样。这就像采用代数表达式 x(x+1) 并将其中一个 x 替换为常数。

        在 n log n 中,n 是一个变量。在大 O 表达式中,C 是一个常数。

        【讨论】:

          【解决方案7】:

          n 的值取决于输入集,C 的值是固定的。

          所以是的,如果 n = 16 和 C = 256,对于一个小的输入集,它看起来像 n^2 * lg(n)。现在将输入集增加到 100,000,000; C 的值保持在 256,你现在有 256 * lg (100,000,000)

          【讨论】:

            【解决方案8】:

            每当我遇到大问题时,我发现将其视为一场比赛很有用: 我选择一个大哦函数(所以,在你的情况下,logn)和一个常数(c)。重要的是我必须选择一个真正的价值。我通常选择一千,只是因为。 然后我必须让我的宿敌选择他选择的任何一个。他通常选择十亿。

            然后我进行比较。

            为了结束这个例子,现在 10^9*(log(10^9)) 显然比 1000log(10^9) 大得多。因此,我知道 big-oh 是行不通的。

            【讨论】:

              猜你喜欢
              • 2010-12-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多