答:普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex(graphtheory)),且其所有边的权值之和亦为最小。该算法于年由捷克数学家沃伊捷赫·亚尔尼克(英语:VojtěchJarník)发现;并在年由美国计算机科学家罗伯特·普里姆(英语:RobertC.Prim)独立发现;年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。与普里姆算法不同,它的时间复杂度为O(eloge)(e为网中的边数),所以,适合于求边稀疏的网的最小生成树。Prim算法和Kruskal算法都是贪心算法。贪心的核心思想是选择当前最佳,也就是“局部最优”。
诚然,一般情况下”局部最优不能保证“全局最优”,但是对于最小生成树来说,Prim和Kruskal这样的贪心都能保证全局最优。要证明两个算法“全局最优”的性质需要引入安全边”的概念:假设A是某一个最小生成树的子集,如果A+{e}还是某一个最小生成树的子集,那么e就是一条安全边。然后有个定理是说,假设A是图G某个最小生成树的子集,(S,V-S)是图G不妨碍A的-个割,那么割(S,V-S)的轻边是安全边。证明了_上面那个定理之后,可以证明Prim和Kruskal每次通过贪心添加的局部最优”的边都是安全边。从而证明了Prim和Kruskal的正确性。
kruskal算法另外,Prim的复杂度是E+VlogV,Kruskal的复杂度是ElogE(把并查集的复杂度当作常数的话),理论上不管稀疏图稠密图都是Prim更优。学完离散数学和数据结构中图的最小生成树算法,对两种经典算法普利姆算法和克鲁斯卡尔算法有一点自己的认识。