坚持用O表示法

时间:2009-12-15 14:45:42

标签: algorithm big-o analysis

我正在比较两种算法,Prim和Kruskal。

我理解时间复杂性的基本概念以及两者最佳工作时(稀疏/密集图)

我在互联网上找到了这个,但我很难将其转换为英语。

dense graph:  Prim = O(N2)
              Kruskal = O(N2*log(N))

sparse graph: Prim = O(N2)
              Kruskal = O(N log(N))

这是一个很长的镜头,但任何人都可以解释这里发生了什么?

6 个答案:

答案 0 :(得分:5)

Prim是O(N ^ 2),其中N是顶点的数量。

Kruskal是O(E log E),其中E是边数。 “E log E”来自对边缘进行排序的好算法。然后,您可以在线性E时间处理它。

在密集图中,E~N ^ 2。所以Kruskal将是O(N ^ 2 log N ^ 2),这就是O(N ^ 2 log N)。

答案 1 :(得分:3)

好的,这里有。 O(N2)(2 =平方)意味着大N算法的速度随着N的平方而变化 - 因此图形大小的两倍将导致计算时间的四倍。

Kruskal行仅仅是简化的,并假设为E = c * N2c这里可能是一个常数,当N变大时,我们可以假设它明显小于N.您需要了解以下对数定律:log(ab) = log a + log blog(a^n) = n * log a。这两个结合log c<< log N(远小于且可以忽略)应该让你理解那里的简化。

现在,至于原始表达式以及它们的派生地点,您需要检查您从中获取这些表达的页面。但我假设如果你正在看Prim's和Kruskal那么你就能理解这个推导,或者至少如果你不能解释它,那么从长远来看它实际上并没有帮助你...

答案 2 :(得分:2)

Kruskal对图中的边数(E)敏感,而不是节点数。 然而,Prim仅受节点数(N)的影响,计算到O(N^2)

这意味着在密集图中,边数接近N ^ 2(所有连接的节点),其O(E*log(E))的复杂度系数大致相当于O(N^2*log(N))

c是一个常数来说明'几乎',并且与O表示法无关。 log(N ^ 2)与log(N)具有相同的数量级,因为对数超过2的幂,相当大的余量(log(N^2) => 2*log(N),其中O符号为O(log(N)))。

在稀疏图表中,E更靠近N,为您提供O(N*log(N))

答案 3 :(得分:1)

这两种算法为不同的输入(节点和边缘)定义了大O.所以他们将一个转换为另一个来比较它们。

N是图中的数字节点E是边数。

对于密集图,有O(N ^ 2)边

对于稀疏图,有O(N)边。

对于big-O来说,常量当然是无关紧要的,因此c退出

答案 4 :(得分:1)

思想是在密集图中,边数是O(N ^ 2),而在稀疏图中,边数是O(N)。因此他们采用O(E \ lg E)并用E的近似值展开它,以便将其直接与Prim的O(N ^ 2)的运行时间进行比较。

基本上,它表明Kruskal对于稀疏图形更好,而Prim对于密集图形更好。

答案 5 :(得分:0)

首先:n是顶点数。

Prim是O(n ^ 2)那部分很容易。

Kruskal是O(Elog(E)),其中E是边数。在一个密集的图形中,有多达N个选择2个边缘,大约是n ^ 2(实际上它是n(n-1)/ 2,但是谁在计数?)所以,它大约是n ^ 2 log(n ^ 2 )是2n ^ 2 log n,它是O(n ^ 2logn),大于O(n ^ 2)

在稀疏图中,只有n个边,所以我们有n log n小于O(n ^ 2)。

相关问题