算法导论复习——CHP23 最小生成树

        引入

        布线问题

        在电子电路设计中,通常需要将多个组件的针脚连接在一起。 设有 n 个针脚,则至少需要 n-1 根连线连接(每根连线连接两个针脚)。问怎么连线才能使所使用的连线总长度最短?

        建模

        将布线问题用一个连通无向图G = (V,E)表示,结点表示针脚, 边表示针脚之间的连线。对每条边(u,v)∈E赋予权重 ω(u,v) 表示 连接针脚(结点)u和v的代价(连线长度)。                 问题转化为找G中的一个无环T \subseteq E子集 ,使之既能够将所有的结点(针脚)连接起来,又具有最小的权重,即使得算法导论复习——CHP23 最小生成树_第1张图片的值最小。

        生成树

        由于 T 无环,且连接所有顶点,故T必为一颗树,称生成树。

        最小生成树

        具有最小权重的生成树。

        贪心构想

        我们想要达成这样一种贪心策略:保持在每个时刻,该策略生长最小生成树的一条边,并在整个策略的实施过程中,管理一个遵守下述循环不变式的边的集合A :

        在每遍循环之前,A是某棵最小生成树的一个子集

这样的边使得我们可以“安全地”将之加入到集合A而不会破坏A的循环不变式,因此称之为集合 A 的“安全边” 。

        寻找安全边

                切割

                无向图G = (V,E)的一个切割(S,V-S)是集合V的一个划分。

         算法导论复习——CHP23 最小生成树_第2张图片

                横跨切割

                如果一条边(u,v)∈E的一个端点在集合S中,另一个端点在集合V-S中,则称该条边横跨切割(S,V-S)

                尊重

                如果边集A中不存在横跨该切割的边,则称该切割尊重集合A。(就是没有切到A中的边)

                轻量级边

                在横跨一个切割的所有边中,权重最小的边称为轻量级边。   

                一般,如果一条边是满足某个性质的所有边中权重最小的,则称该边是满足给定性质的一条轻量级边 

                MST性质

                设G=(V,E)是一个在边 E 上定义了实数值权重函数ω 的连通无向图。设集合A为E的一个子集,且A包含在图G的某棵最小生成树中,设 (S,V-S) 是图G中尊重集合A的任意一个切割,又设(u,v)是横跨切割(S,V-S)的一条轻量级边。那么边(u,v)对于集合A是安全的

证明:

                设T是一棵包含 A 的最小生成树,且T不包含轻量级边(u,v) (若T包含轻量级边(u,v)则已成立)

                T中包含有G的所有结点,且是一棵树,所以 (u,v) 与 T 中从结点 u 到结点 v 的简单路径 p 形成一个环。

                算法导论复习——CHP23 最小生成树_第3张图片

                对于(u,v)而言, u和v分别处在它所横跨的切割(S,V-S)的两端,且T中至少有一条属于p的边也横跨该切割,设(x,y)是T中属于简单路径 p 但横跨该切割的边,且根据已知条件:切割 (S,V-S) 尊重集合A,所以边(x,y)不在集合A中。 由于边(x,y)位于树T中,是从u到v的唯一简单路径上的一条边,所以将该边删除会导致T被分解为两个连通分量。 将(u,v)加上去,则可以将这两个连通分量连接起来再次形成一棵新的生成树,记为T’=T-{(x,y)}∪{(u,v)}。  由于边(u,v)是横跨切割(S,V-S)的一条轻量级边,而且边 (x,y)也横跨该切割,所以应有ω(u,v)≤ ω(x,y)。因此\omega(T') = \omega(T)-\omega(x,y)+\omega(u,v)

                而T是一棵最小生成树,所以还应有ω(T)≤ ω(T')。 所以ω(T)=ω(T'),即T'一定也是一棵最小生成树。又A\subseteq T(x,y)\notin AA\subseteq T'

                因此由于T'是最小生成树,所以(u,v)对于集合A是安全的。

                证毕。

                基于此,有算法

                算法导论复习——CHP23 最小生成树_第4张图片 

                算法执行的任意时刻,图G_A=(V,A)是一个森林。 G_A中的每个连通分量是一棵树

                某些连通分量可能是仅含一个结点的树,如在初始时,A=Ø,G_A中有 |V|棵树,每棵树都只有一个结点。

                对于安全边(u,v),由于A∪{(u,v)}必须无环,所以 (u,v) 连接的是G_A中的两个不同连通分量。 

                MST性质推论

                设G = (V,E)是一个无向连通图,并有定义在边集合 E上的实数值权重函数ω。设集合A为E的一个子集,且A包含在图G 的某棵最小生成树中。设C =(V_C,E_C)为森林G_A = (V,A)中的一个连通分量,边 (u,v)∈E、 (u,c)\notin A是C连接和G_A中其它连通分量的所有边中权重最小的边,则边(u,v)对于集合A是安全的。

证明:

        由于C是一个连通分量,与其它连通分量没有边连接,所以定义在 C 的结点集V_C上的切割(V_C ,V-V_C)尊重集合A,即A 中没有横跨该切割的边。而边(u,v)就是横跨该切割的一 条轻量级边,根据MST性质,(u,v)对于集合A是安全的。

        证毕

Kruskal 和 Prim

        实际上,对于MST性质的不同细化,就形成了这两种不同的算法。

        Kruskal算法

        集合A始终是森林,开始时A就是G中所有单节点构成的森林,之后每次加入A中的安全边是连接A中两分量的权重最小的边算法导论复习——CHP23 最小生成树_第5张图片

        时间复杂度:

                        O(ElgE)(并查集实现) 

        Prim算法

        集合A始终是一颗树,每次加入A中的安全边是连接A中点和A外点的权重最小的边

        算法导论复习——CHP23 最小生成树_第6张图片

时间复杂度:

O(VlgV+ElgV) = O(ElgV)

从渐进意义上看,Kruskal和Prim算法具有相同的运行时间。

 

你可能感兴趣的:(算法导论,算法)