Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Big o 什么';那是我的大O?_Big O - Fatal编程技术网

Big o 什么';那是我的大O?

Big o 什么';那是我的大O?,big-o,Big O,我的值排序程序时钟位于: 100000 8秒 1000000 82秒 10000000 811秒 是O(n)吗?我觉得它像O(n)。是的,我觉得它像O(n)-从第一个到第二个,从第二个到第三个,你的输入要大10倍,花费的时间要长10倍 特别是,看起来您可以通过以下方法预测困难时期: f(n) = n / 12500 或 对于所提供的数据,它给出了O(n)的最简单解释 编辑:但是。。。正如已经指出的那样,数据可能会以各种方式误导你——我很喜欢丹尼斯·帕尔默的观点,即IO成本比其他成本都小。例

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

  • 100000 8秒
  • 1000000 82秒
  • 10000000 811秒
是O(n)吗?

我觉得它像O(n)。

是的,我觉得它像O(n)-从第一个到第二个,从第二个到第三个,你的输入要大10倍,花费的时间要长10倍

特别是,看起来您可以通过以下方法预测困难时期:

f(n) = n / 12500

对于所提供的数据,它给出了O(n)的最简单解释

编辑:但是。。。正如已经指出的那样,数据可能会以各种方式误导你——我很喜欢丹尼斯·帕尔默的观点,即IO成本比其他成本都小。例如,假设您有一个运算绝对数为:

f(n) = 1000000000000n + (n^2)
在这种情况下,复杂度仍然是O(n^2),但在n非常大之前,从观察结果来看,这不会变得明显


我认为可以准确地说,这些观察结果暗示了O(n)算法,但这并不意味着它肯定是这样。

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

是的,这是O(n),因为它随项目数量而变化

1000000 = 10 * 100000


时间行为不是这样的。实际上,这三个数据集之间的距离大致为O(n)。这并不意味着算法是O(n)

第一个问题是,我可以很容易地画出一条指数曲线(O(e**n)),它仍然包括这三个点

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

是的,它看起来是O(n),但我认为您无法根据算法的定时性能对其进行决定性分析。您可能正在使用效率最低的排序算法,但由于数据读/写时间占总执行时间的大部分,因此会产生O(n)个计时结果


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

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

你说不出来

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

第二,O表示法说明了从n0开始的大值n的函数行为。这可能是因为您的算法可以很好地扩展到特定的输入大小,然后其行为会发生变化,比如g(n)函数


通常情况下:如果输入的数据大n倍,则需要的时间会长n倍。@Stephan202:事实上-我只是按照给出的示例数字进行操作。(我更新了答案以使其更清楚-谢谢。)是的:如果时间被I/O之类的内容所支配,那么算法可能是bogosort(平均性能为O(n!n))1.我没有投反对票。然而,我也没有投赞成票,因为我担心你可能助长了他的错觉,即一个人可以从三个数据点得出算法的时间行为。也许这与此有关?当然可能是基数排序-但我同意,通用O(n)排序有点可疑:)+1 Landau符号适用于算法而不是程序。@nojo:我使用std::sort(introsort?)和0-10000范围内的随机值(stdlib::rand())。我猜这些事实将不得不作为这些样本的O(n)的假设?嗯-我猜你没有使用随机输入-我不确定O(n)是否可能用于某种随机输入(如Jon Skeet所说),尽管你的结果看起来确实如此。深入研究Jon Skeet的评论,基数排序可能看起来是O(n)(),所以这可能就是你看到的。也可能是元素大小足够小,以至于其计算的n log n部分还没有占据主导地位。这是一个非常小的样本大小,可以肯定地得出任何结论。要进行正确的统计分析,您需要更多。@outis:您的意思是,尽管这些样本的O(n)稳定,100000000个值的O()可能会偏离?这正是他的意思:)它可能是对数的。回想一下对数图。如果您将其分解为足够多的部分,它们可以轻松地线性表示。谁说1000000000的下一个值不是5000000000?
1000000 = 10 * 100000
82s = 10 * 8s (roughly)