什么是我的大O?

时间:2009-11-13 15:30:57

标签: big-o

我的排序值的程序时钟位于:

  • 100000 8s
  • 1000000 82s
  • 10000000 811s

那是O(n)吗?

8 个答案:

答案 0 :(得分:17)

看起来像,但实际上,你真的需要分析算法,因为根据数据可能会有不同的情况。例如,一些算法对预先排序的数据做得更好或更差。你的算法是什么?

答案 1 :(得分:10)

是的,对我来说看起来像是O(n) - 从第1个案例到第2个案例,从第2个案例到第3个案例,你的输入量增加了10倍,而且它的使用时间延长了10倍。

特别是,您可以使用以下方式预测粗略时间:

f(n) = n / 12500

f(n) = n * 0.00008

给出了所提供数据的O(n)的最简单解释。

编辑:但是......正如已经指出的那样,有多种方式可能会误导您的数据 - 我更喜欢丹尼斯·帕尔默认为IO成本相形见绌。例如,假设您有一个算法,其绝对操作数为:

f(n) = 1000000000000n + (n^2)

在这种情况下,复杂性仍然是O(n ^ 2),但是在观察到n非常大之前,这种情况不会很明显。

我认为这些观察结果暗示O(n)算法是准确的,但这并不意味着它确实存在。

答案 2 :(得分:8)

时间行为不起作用。所有你真的可以说这三个数据集大致相互O(n)。这并不意味着算法是O(n)。

第一个问题是我可以很容易地绘制一条指数(O(e ** n))的曲线,但仍包括这三点。

但最大的问题是你没有对数据说什么。有许多排序算法接近O(n)的排序或近似排序的输入(例如:Mergesort)。但是,它们的平均情况(通常是随机排序的数据)和最坏的情况(通常是反向排序的数据)总是O(nlogn)或更糟。

答案 3 :(得分:4)

你无法分辨。

首先,时间取决于数据,环境和算法。如果你有一个零数组并尝试对它进行排序,那么对于1000或1000000个元素,程序运行时间应该没有太大差别。

其次,O符号表示n的大值的函数行为,从n0开始。可能是您的算法可以很好地扩展到某个输入大小,然后其行为也会发生变化 - 就像g(n)函数一样。

alt text

答案 4 :(得分:2)

对我来说看起来像O(n)。

答案 5 :(得分:2)

是的,那是O(n),因为它随着项目数量而缩放。

1000000 = 10 * 100000

82s = 10 * 8s (roughly)

答案 6 :(得分:2)

你不能依赖它来说它是O(n)。例如,Bubblesort可以在n个步骤中完成,但它是一个O(n ^ 2)算法。

答案 7 :(得分:1)

是的,它似乎是O(n),但我认为你不能根据它的定时性能最终分析算法。您可能正在使用效率最低的排序算法,但由于数据读/写时间占总执行时间的大部分,因此具有O(n)个定时结果。

编辑:Big-O取决于算法的效率及其扩展方式。随着输入项数量的增加,它应该预测执行时间的增长。反过来不一定是真的。观察执行时间的增长可能意味着一些不同的事情。如果它与您给出的示例数字保持一致,那么您可以得出结论,您的程序在O(n)运行,但正如其他人所说,这并不意味着您的排序算法是O(n)。