我的排序值程序时钟在:
- 100000 8s
- 1000000 82s
- 10000000 811s
那是O(n)吗?
看起来是这样,但实际上,你确实需要分析算法,因为根据数据可能会有不同的情况。例如,某些算法对预先排序的数据做得更好或更差。你的算法是什么?
是的,对我来说,这看起来像 O(n) - 从第 1 种情况到第 2 种情况以及第 2 种情况到第 3 种情况,您已经将输入放大了 10 倍,并且花费了 10 倍的时间。
特别是,您可以使用以下方法预测粗略时间:
f(n) = n / 12500
或者
f(n) = n * 0.00008
它为所提供的数据提供了 O(n) 的最简单解释。
编辑:但是...正如已经指出的那样,数据可能会以多种方式误导您-我更喜欢丹尼斯·帕尔默(Dennis Palmer)的想法,即 IO 成本使其他一切都相形见绌。例如,假设您有一个算法,其绝对操作数为:
f(n) = 1000000000000n + (n^2)
在那种情况下,复杂度仍然是 O(n^2),但是在 n 非常大之前,这不会从观察中变得明显。
我认为可以准确地说这些观察结果暗示了 O(n) 算法,但这并不意味着它肯定是。
时间行为并非如此。您真正可以说的是,这三个数据集彼此之间的距离大约为 O(n)。这并不意味着算法是 O(n)。
第一个问题是我可以很容易地绘制一条指数曲线( O(e**n) ),但它仍然包含这三个点。
但最大的问题是你没有对数据说任何话。对于已排序或接近排序的输入,有许多排序算法接近 O(n)(例如:Mergesort)。然而,它们的平均情况(通常是随机排序的数据)和最坏情况(通常是反向排序的数据)总是 O(nlogn) 或更糟。
你说不出来。
首先,时间取决于数据、环境和算法。如果您有一个零数组并尝试对其进行排序,那么对于 1000 或 1000000 个元素,程序运行时间应该没有太大差异。
其次,O 表示法讲述了从 n0 开始的较大 n 值的函数行为。可能是您的算法可以很好地扩展到特定的输入大小,然后它的行为会发生变化——比如 g(n) 函数。
对我来说,它看起来像 O(n)。
是的,那是 O(n),因为它与项目的数量成比例。
1000000 = 10 * 100000
和
82s = 10 * 8s (roughly)
你不能依赖它说它是 O(n)。例如,冒泡排序可以在 n 步内完成,但它是一个 O(n^2) 算法。
是的,它似乎是 O(n),但我认为你不能根据算法的定时性能来最终分析算法。您可能正在使用最低效的排序算法,但有 O(n) 时间结果,因为数据读取/写入时间占总执行时间的大部分。
编辑: Big-O 取决于算法的效率及其扩展方式。随着输入项目数量的增加,它应该预测执行时间的增长。反过来不一定是真的。观察执行时间的给定增长可能意味着一些不同的事情。如果它与您给出的示例数字保持一致,那么您可以得出结论,您的程序以 O(n) 运行,但正如其他人所说,这并不意味着您的排序算法是 O(n)。