【问题标题】:Why can't we always just pick the biggest term with big-O notation?为什么我们不能总是选择带有大 O 符号的最大项?
【发布时间】:2019-04-01 02:57:30
【问题描述】:

我正在看《Cracking the Coding Interview 6th edition》第 49 页,示例 8。

假设我们有一个算法,它接收一个字符串数组,对每个字符串进行排序,然后对整个数组进行排序。运行时是什么?

如果最长字符串的长度是s,数组的长度是a,书上说对每个字符串进行排序是:

O(a*s log s)

我的理解是复杂度取决于这种情况下的上限,所以应该是:

O(s log s)

例如,如果s 是最长字符串的长度,s1s2s3 是其他字符串的长度,则复杂度为:

O(s log s + s1 log s1 + s2 log s2 + s3 log s3)

最终是:

O(s log s)

因为s 的值最高。为什么我们需要与a相乘?

【问题讨论】:

  • O(a*s log s) 表示运行时间受该时间限制,它不一定等于a*s log s - 如果每个字符串的长度为 s,就会发生这种情况。大 O 代表最坏的情况。当您使用 Big O 分析时间复杂度时,您需要考虑最坏的情况。
  • 我明白我在这里感到困惑。感谢您的回复。

标签: algorithm time-complexity big-o


【解决方案1】:

只有在数量不变的情况下,您才能忽略较小的术语。

忽略较小项的能力实际上源于您可以忽略常数因子,但这仅在您具有恒定数量的较小项时才有效(否则常数因子不会是常数)。

直观地说:

如果你有 50000000000 个长度为 10 的字符串怎么办? 10 log 10 的某些预定义因子听起来不适合运行时间,您需要在某处使用 50000000000。

数学上:

假设您有f(n) + g(n),其中g(n) 小于f(n),因为n 趋于无穷大。

你可以这样说:

f(n) <= f(n) + g(n) <= f(n) + f(n) = 2.f(n)    (as n tends to infinity)

现在您已经取消了g(n),对于f(n)12 之间只有一个常数因子,您可以用渐近符号忽略它,因此复杂度就是 O(f(n))

如果您有一个可变数量的术语a,那么您将拥有a.f(n),并且您不能忽略a

a.f(n) = O(f(n)) 的证明(至少有一种证明方法)涉及选择一个常数 M,使得 |a.f(n)| &lt;= M.f(n) 从某个值 n 开始。无论您选择M 的哪个值,总是可以存在更大的a(只有M+1 可以),因此这个证明失败了。

【讨论】:

    【解决方案2】:

    正如 Dukeling 所指出的,as 都是这里的参数。

    所以你的算法的运行时间取决于两者。如果没有有关两者之间关系的更多信息,您将无法进一步简化。例如,这听起来不像是a &lt; s

    但是说你得到了a &lt; s。那么你可以说因为你的O(s log s)排序操作需要执行a = O(s)次才能对数组中的所有字符串进行排序,所以总数是O(s^2 log s)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2010-10-27
      • 2012-02-15
      • 2010-09-13
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多