【发布时间】:2010-11-01 08:53:33
【问题描述】:
“算法 A 的最坏情况运行时间”和“算法 A 的运行时间为 O(n)”之间有区别吗?
我认为“没有区别”,因为最坏的情况是函数可以占用的峰值运行时间,O(n) 表示函数“有界”。两者的含义相同。
希望我的逻辑是正确的。
【问题讨论】:
标签: time-complexity asymptotic-complexity
“算法 A 的最坏情况运行时间”和“算法 A 的运行时间为 O(n)”之间有区别吗?
我认为“没有区别”,因为最坏的情况是函数可以占用的峰值运行时间,O(n) 表示函数“有界”。两者的含义相同。
希望我的逻辑是正确的。
【问题讨论】:
标签: time-complexity asymptotic-complexity
有区别。
算法是 O(f) 并不精确:您必须说算法在其最佳/最差/平均情况下是 O(f)。当最佳、最差和平均相同时,您可以说是 O(f),但这并不常见。
【讨论】:
ArrayList
(在 Java 中;Python list
,Ruby Array
和其他功能类似)为您提供了分期 O(1) 附加,但如果您碰巧是触发调整大小的幸运附加,您将得到(相对)比平均情况慢得多的响应。
我同意你的观点,但有一些常见算法(例如快速排序)的预期时间比最坏情况的时间要好得多。您可以声称快速排序是 O(N^2) 最坏的情况,但您仍然希望它几乎总是 O(N*log N)(至少对于一个好的实现而言)。
具有摊销行为的算法也会变得复杂。对于一个特定的操作,您可能会得到 O(N) 或 O(log N),但在摊销的意义上,连续的许多操作将始终是 O(1)。展开树和手指树是此类的很好的例子。
【讨论】:
作为绝对度量的运行时间通常不如当您添加更多数据时该时间如何增加那么重要。例如,一个算法总是需要 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)。
【讨论】:
这些单词串之间存在巨大差异。 “算法A的最坏情况运行时间”是一个名词从句,它根本不做任何陈述。 “算法 A 的运行时间是 O(n)”是一句话,告诉我们一些关于 A 的事情。
【讨论】: