美文网首页AL & DS
贪婪算法和MST

贪婪算法和MST

作者: 程序猪小羊 | 来源:发表于2018-02-03 13:00 被阅读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算法因为只与顶点有关,所以适合求稠密图的最小生成树。

相关文章

  • 贪婪算法和MST

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

  • 操作说明

    py-mst-dbscan mst-dbscan算法使用Python实现,算法相关原理和具体细节,请参考: 201...

  • 读书笔记

    读书笔记/人生算法之无知、衰朽和贪婪 【标题】人生算法之无知、衰朽和贪婪 【书籍】人生算法 【01】人生算法之无知...

  • 代码小工蚁的#《算法图解》#学习笔记-C8贪婪算法

    代码小工蚁的#《算法图解》#学习笔记-C8贪婪算法C8 贪婪算法greedy algorithms 一、贪婪算法 ...

  • (10)图算法2: 最小生成树, 最短路径

    最小生成树(MST)问题 对象: 该问题总是针对连通无向图G = (V, E); 总体算法这个算法理出大概的思路,...

  • RSTP和MST

    一、RSTP相关概念 1.当网络拓扑发生改变时,快速生成树协议(802.1w)能够明显地加快重新计算生成树的速度。...

  • 贪婪算法与黑箱测试——我们是如何选择的

    首先简单介绍一下贪婪算法和黑箱测试的概念: 简单来说,贪婪算法就是通过局部最优达到整体最优的算法。当一个任务过于庞...

  • 贪婪、分治、回溯和动态规划,四种算法的比较

    贪婪算法 贪婪算法,也被称为“贪心算法”。贪婪算法分阶段地工作。在每一个阶段,都可以认为所作决定是好的,而不考虑将...

  • 四种算法思想(下)贪婪与动态规划

    贪婪和动态规划 贪婪算法和动态规划算法都是在多阶段决策最优解模型下求最优解。使用这两种算法可以算出来的,当然就可以...

  • 贪婪算法

    1.贪婪算法: 每一步都采用当前局部的(这里是重点)最优的做法,最终得到全局最优解;这是一种完美算法,要找到最优的...

网友评论

    本文标题:贪婪算法和MST

    本文链接:https://www.haomeiwen.com/subject/aeuyzxtx.html