欢迎光临散文网 会员登陆 & 注册

【算法分析】迪杰斯特拉

2020-12-15 00:05 作者:米诺加油努力  | 我要投稿

建议电脑端观看

算法名称       :迪杰斯特拉


算法适用范围:解决图论中的单源最短路径问题

        概述:有无向图P,起点A,求其它P中所有点到A点得最短路长度 


算法局限性    :负边权无法使用 


算法涉及思想:贪心,减治 


算法优越性    :相对暴力(深搜)

        暴力做法:

                对整个图进行深搜,得到答案 

        迪杰斯特拉:

                利用有效信息进行贪心,可以减少多余的前置运算


算法优越解释

        对初始情况,除初始点未知任何最短路径 

                设初始点为A

                图中存在一点B是A的直连点

                命题1

                        假设A->B的长度小于其它A的直连点到A的长度

                        则A->B是A到B的最短路 

                证明1

                        假设存在一个链A->N1->N2->...->Nn->B 

                                且这个链是A到B的最短路

                        则A->B的长度<A->N1的长度

                        即A->B不是A到B的最短路 


                        证得:命题1的逆否命题为真,故命题1为真 

                由命题1得:在初始情况下,必然能从与A直接相连的若干个点中找到一个

                               点,该点与A的直接距离就是其最短路径


        对后续情况,已知部分最短路径 

                设已经求出最短路的点集合为S{A,N1,N2,N3,...,Nn} 

                设A为初始点

                S外有一点B 

                命题2

                        假设L3是A到B的最短路,Nan是路上一点,且Nan在S内 

                        假设L1是A到Nan的最短路

                        假设L2是Nan到B的最短路

                        则L1+L2=L3 

                证明2

                        假设L4>L1,L4是A到Nan的另一条路 

                        假设L5>L2,L5是Nan到B的另一条路 

                则知:

                        L1+L2<L4+L5 

                        L1+L2<L1+L5

                        L1+L2<L4+L2

                由最短路定义得:

                        L3=L1+L2 

                命题2得证


                由命题2得:需要解决的问题从找最短路变成了找Nan

                核心优化(减治): 

                        如果所有S内的点重合在一处,那么就不必找Nan了

                                此时L1=0,L2即是L3

                                而且A与Nan重合,故L2就是A到B的最短路

                                问题甚至转化成了初始情况:

                                        A与S外的点“直连”(即0+L2)

                                此时可以用初始情况的结论来解决下一个点 


操作总论

        初始情况时,找到与A直连的最近的点B

        即求得B的最短路,并将之放入S中 

        为了保持所有S中的点与A重合在一处,

        需要将每次放入S的新点N做以下处理:

                1.设M与N直连,A到M的已知距离是L

                2.将L更新为min(L,A到N的最短路+M到N的距离) 

        这样处理之后,N点与A点可重合

                而A与S外点之间的距离又没有被这个操作影响



实现就放图算了


【算法分析】迪杰斯特拉的评论 (共 条)

分享到微博请遵守国家法律