【问题标题】:Is "best case performance Θ(1) -> running time ≠ Θ(log n)" valid?“最佳情况下性能 Θ(1) -> 运行时间 ≠ Θ(log n)”是否有效?
【发布时间】:2015-03-30 05:23:37
【问题描述】:

这是一个证明算法的运行时间不能被认为是Θ(f(n))而应该是O(f(n))的论据。

例如这个关于二分查找的问题:Is binary search theta log (n) or big O log(n)

MartinStettner 的 response 更令人困惑。

考虑*-case的表演:

最佳情况性能:Θ(1)
平均情况下的性能:Θ(log n)
最坏情况下的性能:Θ(log n)

然后他引用了Cormen、Leiserson、Rivest:“算法简介”

当我们说“运行时间是 O(n^2)”时,我们的意思是最坏情况下的运行时间(它是 n 的函数)是 O(n^2) ...

这不是表明running timeworst-case running time 是同义词吗?

此外,如果running time 指的是具有自然输入f(n) 的函数,则必须有包含它的Θ 类,例如Θ(f(n)),对吧?这表明您有义务使用O 表示法,只有当运行时间不是很精确时(即只知道一个上限)。

【问题讨论】:

  • 这个问题可能更适合the Computer Science community
  • 我应该删除它并在那里重新发布吗?
  • 很难说,大问题确实在这里得到了解答,但由于这很深,你可能会在计算机科学方面取得更大的成功。
  • vuplea:是的。而这个“最佳案例”实际上并没有任何意义。

标签: performance big-o time-complexity complexity-theory big-theta


【解决方案1】:

当您编写O(f(n)) 时,这意味着您的算法的运行时间由函数c*f(n) 限定,其中c 是一个常数。这也意味着您的算法可以在比c*f(n) 少得多的步骤中完成。我们经常使用 Big-O 表示法,因为我们想要包含算法完成速度比我们指示的更快的可能性。另一方面,Theta(f(n)) 意味着算法总是在c*f(n) 步骤中完成。二进制搜索是O(log(n)),因为它通常会在log(n) 步骤中完成,但如果幸运的话可以一步完成(最佳情况下的性能)。

【讨论】:

    【解决方案2】:

    如果我读到有关运行时间的信息,我总是会感到困惑。

    对我来说,运行时间是算法的实现需要在计算机上执行的时间。这可能在很多方面有所不同,因此是一件复杂的事情。

    所以我认为算法的复杂性是一个更好的词。

    现在, 复杂性(在大多数情况下)是最坏情况下的复杂性。如果您知道最坏情况的上限,那么您也知道它只能在其他情况下变得更好。

    因此,如果您知道存在一些(可能是微不足道的)情况,您的算法只执行几个(常数)步骤并停止,您不必关心下限,因此您(通常) 使用 big-O 或 little-o 表示法的上限。

    如果您仔细计算,也可以使用Θ 表示法。

    但请注意:所有复杂性都只存在于它们所关联的案例中。这意味着:如果您做出“输入是最佳情况” 之类的假设,这会影响您的计算以及由此产生的复杂性。在二进制搜索的情况下,您发布了三种不同假设的复杂性。 你可以这样概括:“二分搜索的复杂性在于O(log n),因为Θ(log n) 的意思是“Ω(log n)O(log n)”,而O(1) 是@ 的子集987654329@.

    总结: - 如果你知道复杂度的精确函数,你可以在Θ-notation 中给出复杂度 - 如果你想得到一个整体的上限,你必须使用O-notation,直到所有输入案例的下限与上限没有差异。 - 在大多数情况下,您必须使用O-notation,因为算法过于复杂,无法获得接近的上限和下限。

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 2021-11-03
      • 2011-01-06
      • 1970-01-01
      • 2015-08-29
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多