【问题标题】:Worst case vs O(n)最坏情况与 O(n)
【发布时间】:2010-11-01 08:53:33
【问题描述】:

“算法 A 的最坏情况运行时间”和“算法 A 的运行时间为 O(n)”之间有区别吗?

我认为“没有区别”,因为最坏的情况是函数可以占用的峰值运行时间,O(n) 表示函数“有界”。两者的含义相同。

希望我的逻辑是正确的。

【问题讨论】:

    标签: time-complexity asymptotic-complexity


    【解决方案1】:

    有区别。

    算法是 O(f) 并不精确:您必须说算法在其最佳/最差/平均情况下是 O(f)。当最佳、最差和平均相同时,您可以说是 O(f),但这并不常见。

    【讨论】:

    • 我认为一般情况和最坏情况具有相同的 Big-O(IE、堆排序、合并排序、基数排序、大多数搜索等)是很常见的。唯一一次看到与平均情况不同的最坏情况是,算法是否容易受到某些数据集的影响(即快速排序的 3 中位数杀手)。
    • @KendallHopkins 任何可以调整大小的容器都会为您提供截然不同的最坏情况与平均值。 ArrayList(在 Java 中;Python list,Ruby Array 和其他功能类似)为您提供了分期 O(1) 附加,但如果您碰巧是触发调整大小的幸运附加,您将得到(相对)比平均情况慢得多的响应。
    【解决方案2】:

    我同意你的观点,但有一些常见算法(例如快速排序)的预期时间比最坏情况的时间要好得多。您可以声称快速排序是 O(N^2) 最坏的情况,但您仍然希望它几乎总是 O(N*log N)(至少对于一个好的实现而言)。

    具有摊销行为的算法也会变得复杂。对于一个特定的操作,您可能会得到 O(N) 或 O(log N),但在摊销的意义上,连续的许多操作将始终是 O(1)。展开树和手指树是此类的很好的例子。

    【讨论】:

      【解决方案3】:

      作为绝对度量的运行时间通常不如当您添加更多数据时该时间如何增加那么重要。例如,一个算法总是需要 5 秒来处理 100 个项目,10 秒来处理 200 个项目等等,被称为 O(N),因为运行时间随着数据集大小线性增加。如果第二种算法需要 5*5 = 25 秒来处理这 200 个项目,则它可能被归类为 O(N^2)。这里没有“峰值运行时间”,因为当您向其投入更多数据时,运行时间总是会增加。

      事实上,大 O 是一个上限 - 所以你可以说第一个算法也是 O(N^2) (如果 N 是一个上限,N*N 更高,因此也是一个上限,尽管一个更宽松的)。表示其他边界的常用符号包括 Ω(欧米茄,下限)和 Θ(θ,同时下限和上限)。

      某些算法(例如,快速排序)根据输入的数据表现出不同的行为 - 因此最坏的情况是 O(N^2),即使它通常表现得好像是 O(N log N)。

      【讨论】:

        【解决方案4】:

        这些单词串之间存在巨大差异。 “算法A的最坏情况运行时间”是一个名词从句,它根本不做任何陈述。 “算法 A 的运行时间是 O(n)”是一句话,告诉我们一些关于 A 的事情。

        【讨论】:

        • 抱歉,但是当问题的标题和正文都犯了同样的“错误”时,我看不出这是一个错字。我只是在回答提出的问题。
        • 很公平。你应该建议他修改措辞,以免混淆像你这样的人。一旦措辞确定,您的答案就不太可能具有相关性。