我正在比较两种算法,Prim和Kruskal。
我理解时间复杂性的基本概念以及两者最佳工作时(稀疏/密集图)
我在互联网上找到了这个,但我很难将其转换为英语。
dense graph: Prim = O(N2)
Kruskal = O(N2*log(N))
sparse graph: Prim = O(N2)
Kruskal = O(N log(N))
这是一个很长的镜头,但任何人都可以解释这里发生了什么?
答案 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 * N2
。 c
这里可能是一个常数,当N变大时,我们可以假设它明显小于N.您需要了解以下对数定律:log(ab) = log a + log b
和log(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)。