堆积的大哦符号

时间:2013-01-06 08:37:42

标签: algorithm

我想要了解大哦符号。任何帮助将不胜感激。

假设有一个程序可以创建最大堆,然后按下并删除该项。

假设有n个项目。

要创建堆,如果已将其读入数组然后堆积它,则需要O(n)进行堆积。 要推送一个项目,需要O(1)并删除它,需要O(1) 要在此之后进行堆积,每次删除需要log n,n个项目需要n log n

所以大哦符号是O(n + n log n) 或者,是O(n log n)只是因为我们选择了最大的那个。

2 个答案:

答案 0 :(得分:0)

在堆中堆积新元素的复杂性是O(logN),而不是O(1)(除非您使用Fibonacci heap,但似乎并非如此)。

此外,没有符号O(N + NlogN),因为NlogN的增长速度比N快,所以此符号只是写为O(NlogN)

编辑:大哦符号只描述函数的渐近行为,即它的增长速度。当你接近无穷大2*f(x)11021392103*f(x)时表现相似,这就是为什么当写大哦符号时,我们忽略函数前面的任何常量。

答案 1 :(得分:0)

正式来说,O(N + N log N)相当于O(N log N)

那就是说,假设每个都有埋藏系数,ala:O( aN + bN log(cN) )。如果您有非常大的N值,则这些系数变得不重要,并且算法仅受其最大项的限制,在这种情况下,该项是log(N)

但这并不意味着系数完全不重要。这就是为什么在图算法的讨论中,你会经常看到作者说“Floyd-Warshall algorithm在O(N ^ 3)时间内运行,但系数很小”。

如果我们能以某种方式写O(0.5N ^ 3)在这种情况下,我们会。但事实证明,系数会根据您实现算法的方式以及运行它的计算机而有所不同。因此,我们决定进行渐近比较,不一定是因为它是最好的方法,而是因为没有真正好的选择。

您还会看到“最坏情况:O(N ^ 2),平均情况:O(N)”之类的内容。这是尝试捕获算法的行为如何随输入而变化。通常情况下,预先分类或随机输入可以给出平均情况,而邪恶的恶棍可以构造产生最坏情况的输入。

最终,我所说的是:O(N + N log N)=O(N log N)。这是事实,这是你作业的正确答案。但是我们使用这个大O符号进行通信,并且在时间充裕的情况下,您可能会发现O(N + N log N)更具表现力的情况,也许您的算法通常用于小N。在这种情况下,不要过于担心形式主义 - 只要清楚你要用它来表达什么。