Selected as the "No.1 popular" from the top ten classsic algorithms in the world through web investigation,
I spent no more than 2 hours for a breath-retaking tour and detour around the entire Union-Find Algorithm:
Here's my break-into-pieces whole analysis:
Basic Concept--The inverse form of Ackermann Function
AckermannFunction Definition:(you can alternatively define AckermannFunction '--1' formular to another form, for instance, A(1,j)=j+1 for different occasions
A(1,j)=2exp(j), j>=1 --1
A(i,1)=A(i-1,2), i>=2 --2
A(i,j)=A(i-1,A(i,j-1)), i,j>=2 --3
Then we define the inverse of Ackermann Function as:
a(M,N)=min{i>=1|A(i,[M/N])>logN}
it can be easily seen that one calculates the times that the iAckermann Function operates even much slower than log*N.
Now we are going to prove that any kind or order of M=omiga(N) union-find operations take a total of O(Mlog*N) times:
由于定理太多,直接采用多线推理解说,证明过程溶于解说中:规定秩为r,树为T,秩组为G
Conclusion 1:在一棵二项树中,执行任何union指令,一个秩为r的node一定至少含有2exp(r)个子节点。该定理通过数学归纳法和假设法可以pass。
假设T具有最少子节点,T的形成是最后一次union op为子节点T1和T2的union。如果T1秩为r,那么T1高度为r,且T1含有2exp(r)个子节点,T1也有最少子节点,而T1节点数一定小于T,矛盾,从而T1的秩<=r-1。又因为T是由T1和T2合并而成,T1已经小于T的秩,T2就是唯一能增加T的秩的树,那么T2一定>=T2,又T2<=r-1,所以T2的秩r2一定=r-1,从而T1秩为r-1.因此,T的子节点数目为2exp(r-1)+2exp(r-1)为2exp(r). 定理1得证。
Conclu 2:秩为r的节点数目(横向)最多为N/2exp(r)
由conclu1结论很容易prove。
Conclu3:从树叶到根的routine上,所有的节点的秩单调递增。
树的基本特征,一眼看出,在做路径压缩操作时,秩不改变。
再做一些定义和差异化标志。
定义:把一片森林中的树按照秩的不同,分成不同秩组,秩r在秩组G(r)中,每个秩G的最大秩为F(G),则G和F互逆。
差异化规则,简化起见:1,如果节点v是森林的根,或者v的父亲是根,那么该节点v为特殊顶点,给v做标记Z。
2,如果节点v不是情况1,那么给v做标记Y。
现在求,M次随机的Union/Find操作总共有多少Y和Z?
Conclu4:任意一次Union/Find操作,Y和Z标记的总和等于路上的节点个数。
一眼看出。
Conclu5:M次操作后,N的标记个数最多共有M(G(N)+2)
执行一次Union/Find操作,需要经过根节点和根的子节点(秩为1),总共2个节点,而一次操作最多经过G(N)节点,所以总共有M(G(N)+2)个标记Z。
Conclu6:秩组g>0中,节点个数V(g)最多为N/2exp(F(g-1))个
有Conclu2可知,秩为r的节点个数最多为N/2exp(r)个。那么秩组中的所有节点个数
V(g)<=N/2exp(F(g-1)+1) + ...+N/2exp(F(g))
<=N/2exp(F(g-1)+1) + ... + infinity
<=N/2exp(F(g-1)+1) * (1/2exp(0) + 1/2exp(1) + ... + 1/2exp(infinity))
<=N/2exp(F(g-1))
Conclu7:秩组g所有节点,最多可以有NF(g)/2exp(F(g-1))个标记Y
每个节点最多有F(g)个Y标记,所以由Conclu6可证。
Conclu8:结合Conclu7和Conclu5,可求得一棵森林中,所有的节点在M次操作后,总共的标记数
S = M(G(N)+2) + N* SUM(F(g)),g=0,1,2...G(N))/2exp(F(g-1))
选取F(g)方式:按照递归函数F(g)=2exp(F(g-1))和终结条件F(0)=0----单值Ackermann函数
得出S=O(Mlog*N) + O(Nlog*N) = O(Mlog*N)
这是一个时间界,但不够严格,用到类似单值Ackermann函数,求证并不困难,分析也简单,主要难点在于求证数量多,而且连接紧凑。

浙公网安备 33010602011771号