贪心算法的正确性证明

prim算法

设现有一无向连通图 G = ( V , E ) \bm{G}=(\bm{V,E}) G=(V,E),其中边集 E = { e 1 , e 2 , e 3 , . . . e m } \bm{E}=\{e_1,e_2,e_3,...e_m\} E={e1,e2,e3,...em},节点集 V = { v 1 , v 2 , v 3 , . . . v n } \bm{V}=\{v_1,v_2,v_3,...v_n\} V={v1,v2,v3,...vn}。prim算法目的是要从确定的节点 v i v_i vi出发形成一颗最小生成树,即生成树(无向无环连通图)中所包含的边集权重和最小。
定义 T = ( V , E ′ ) \bm{T=(V,E^{'})} T=(V,E)为图 G \bm{G} G从节点 v 1 v_{1} v1出发生成的最小生成树,其中最小生成树中的边集合 E = { e a 1 , e a 2 , e a 3 , . . . e a ( n − 1 ) } \bm{E}=\{e_{a1},e_{a2},e_{a3},...e_{a(n-1)}\} E={ea1,ea2,ea3,...ea(n1)}

prim算法正确性证明

贪心选择性证明

证明贪心选择性即证明贪心选择的第一步是正确的,换句话说贪心选择的第一步一定包含在某个全局最优解中。
在Prim算法中,由确定的节点 v 1 v_{1} v1出发,选择与此节点相连边集中权重最小的边 e a {e_a} ea。设存在一个最小生成树 T \bm{T} T且其边集合中不包含边 e a {e_a} ea,此时把边 e a {e_a} ea加入此树就会形成环,如果断开树中与 v 1 v_{1} v1相连的另外一条边 e b {e_b} eb,则此时仍然是只有n-1条边的无向连通图,故也是一棵树。由于此时产生的生成树 T ′ \bm{T^{'}} T相较于最优解 T \bm{T} T只是把边 e b {e_b} eb替换为了 e a {e_a} ea,而 e a {e_a} ea是与 v 1 v_{1} v1相连的最小权重边,因此 W ( T ′ ) ≤ W ( T ) \bm{W(\bm{T^{'}})}\le\bm{W(\bm{T})} W(T)W(T),故 T ′ \bm{T^{'}} T也是最小生成树。
综上Prim算法的贪心选择性质得证。

最优子结构性质证明

最优子结构性质是说原问题的最优解中包含子问题的最优解,由于贪心选择算法是一种自底向上的最优选择算法,如果高层问题的最优解不包含底层问题的最优解,那么子问题贪心选择出的最优解是没有意义的。
不失一般性,令 T = ( V , E ′ ) \bm{T=(V,E^{'})} T=(V,E)为图 G \bm{G} G从节点 v 1 v_{1} v1出发生成的最小生成树,令出发节点 v 1 v_{1} v1相连的最小边 e 1 {e_1} e1的另一端节点为 v a v_{a} va,有上一步证明得知边 e 1 {e_1} e1在最优解边集 E ′ E^{'} E中。现在将图 G \bm{G} G和树 T \bm{T} T中的节点 v 1 v_{1} v1 v a v_{a} va融合为一个节点,除去边 e 1 {e_1} e1,与融合后节点相连的重复边只保留权值最小的那条边,此时产生子图 G 2 \bm{G_2} G2和子树 T 2 \bm{T_2} T2。现需证明子树 T 2 \bm{T_2} T2为子图 G 2 \bm{G_2} G2的最小生成树。
假设树 T 2 \bm{T_2} T2不是图 G 2 \bm{G_2} G2的最小生成树,而是另一棵树 T 2 ′ \bm{T_2^{'}} T2,即 W ( T 2 ′ ) ≤ W ( T 2 ) \bm{W(\bm{T_2^{'}})}\le\bm{W(\bm{T_2})} W(T2)W(T2),此时将融合节点还原为节点 v 1 v_{1} v1 v a v_{a} va,并加入边 e 1 {e_1} e1得到树 T ′ \bm{T^{'}} T
此时 W ( T ′ ) = W ( T 2 ′ ) + W ( e 1 ) ≤ W ( T ) = W ( T 2 ) + W ( e 1 ) \bm{W(\bm{T^{'}})}=W(\bm{T_2^{'}})+W(\bm{e_1}) \le \bm{W(\bm{T})=W(\bm{T_2})+W(\bm{e_1}) } W(T)=W(T2)+W(e1)W(T)=W(T2)+W(e1),这与假设矛盾,故树 T 2 \bm{T_2} T2确是图 G 2 \bm{G_2} G2的最小生成树。
综上最优子结构性质得证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值