Time complexity 最坏情况vs O(n)

Time complexity 最坏情况vs O(n),time-complexity,asymptotic-complexity,Time Complexity,Asymptotic Complexity,“算法a的最坏情况运行时间”和“算法a的运行时间为O(n)”之间是否存在差异 我认为“没有区别”,因为最坏的情况是函数可以达到的峰值运行时间,O(n)表示函数是“有界的”。两者含义相同 希望我的逻辑是正确的。有区别 一个算法是O(f)是不精确的:你必须说一个算法在其最佳/最差/平均情况下是O(f)。当最佳、最差和平均值相同时,你可以说这是O(f),但这并不常见。这些字串之间有很大的区别。“算法A的最坏情况运行时间”是一个名词子句,它根本不作任何陈述。“算法A的运行时间是O(n)”是一句话,告诉我

“算法a的最坏情况运行时间”和“算法a的运行时间为O(n)”之间是否存在差异

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

希望我的逻辑是正确的。

有区别


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

这些字串之间有很大的区别。“算法A的最坏情况运行时间”是一个名词子句,它根本不作任何陈述。“算法A的运行时间是O(n)”是一句话,告诉我们一些关于A的事情。

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


它还变得复杂的算法,有摊销行为。对于一个特定的操作,您可能会得到O(N)或O(logn),但一行中的许多操作在摊销意义上总是O(1)。Splay树和Finger树就是这一类的好例子。

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

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


一些算法(例如,快速排序)根据提供给它的数据表现出不同的行为-因此最坏的情况是O(N^2),尽管它通常表现为O(N log N)。

对不起,但是当标题和问题主体都犯了相同的“错误”时,我不清楚这是一个打字错误。我只是简单地回答了这个问题,很公平。你应该建议他修改措辞,以免混淆像你这样的人。一旦措辞固定下来,你的答案就不太可能有意义了。我认为一般情况下和最坏情况下都有相同的大O(即堆排序、合并排序、基数排序、大多数搜索等)。你唯一一次看到最坏情况与平均情况不同的情况是,算法是否容易受到某些数据集的影响(例如,中位数为3的快速排序杀手)。@KendallHopkins任何可以调整大小的容器都会给你一个大不相同的最坏情况与平均值。
ArrayList
(在Java;Python
list
、Ruby
Array
和其他类似的函数中)会提供分期摊销的O(1)个追加,但是如果您碰巧是触发调整大小的幸运追加,您将得到(相对)比平均情况慢得多的响应。