AL & DS

贪婪算法和MST

2018-02-03  本文已影响69人  程序猪小羊

贪婪算法是指,在对问题求解时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解

贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。

Prim和Dijkstra的算法之间的区别?

Dijkstra和Prim算法的区别-附具体步骤
Prim算法通常用于求MST(Minimum Spanning Tree,最小生成树),最小成本路径(通过考虑各条路径上的weight)。
Dijkstra算法考虑最短路径数。不能保证MST,因此成本>MST。

Dijsktra's algorithm finds the minimum distance from node i to all nodes (you specify i). So in return you get the minimum distance tree from node i.

Prims algorithm gets you the minimum spaning tree for a given graph. A tree that connects all nodes while the sum of all costs is the minimum possible.
So with Dijkstra you can go from the selected node to any other with the minimum cost, you don't get this with Prim's

(Never believe anything I said. Only believe it if I prove it.)

Furthest(Farthest) in future算法

http://notebook.xyli.me/CS161/Intro-to-greedy-algo1/
一片很好的博文介绍了贪婪算法在Caching中的应用。

Prim和Kruskal生成MST的比较

什么是最小生成树(MST):
Given: Connected graph, with real valued edges weights.
MST: a subset of edges T - a spanning tree (连接了所有的点)whose sum of edge weights is minimized.

比较
算法流程示意图

摘要如下(侵删)

Prim

Prim算法是这样来做的:

1)首先以一个结点作为最小生成树的初始结点,然后以迭代的方式找出与最小生成树中
2)各结点权重最小边,并加入到最小生成树中。加入之后如果产生
3)回路则跳过这条边,选择下一个结点。当所有结点都加入到最小生成树中之后,就找出了连通图中的最小生成树了。

Kruskal算法与Prim算法的不同之处在于,Kruskal在找最小生成树结点之前,需要对所有权重边做从小到大排序。将排序好的权重边依次加入到最小生成树中,如果加入时产生回路就跳过这条边,加入下一条边。当所有结点都加入到最小生成树中之后,就找出了最小生成树。

Prim算法中寻找的是下一个与MST中任意顶点相距最近的顶点;
Dijkstra算法寻找的是下一个离给定顶点(单源)最近的顶点。
另外,当有两条具有同样的最小权值的边可供选择时,任选一条即可,所以构造的MST不是惟一的

Prim算法和Dijkstra算法十分相似,惟一的区别是: Prim算法要寻找的是离已加入顶点距离最近的顶点;Dijkstra算法是寻找离固定顶点距离最近的顶点。

所以Prim算法的时间复杂度分析与Dijkstra算法相同,都是 O(|V^2|)

【拓】:Kruskal算法:http://baike.baidu.com/link?url=MchMLaw4a3nLu3bWSoEUEak-DYbM8n0H27ANKE5-Gv_frudxAvGfsqdpNRqDtdB0 </pre>

克鲁斯卡尔(Kruskal)算法(只与边相关)

算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。

算法过程:

1.将图各边按照权值进行排序

2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。

不符合条件则继续遍历图,寻找下一个最小权值的边。

3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。

克鲁斯卡尔(Kruskal)算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关,所以适合求稠密图的最小生成树。

上一篇下一篇

猜你喜欢

热点阅读