Dijkstra算法与Prim算法的异同

Dijkstra简述

Dijkstra算法用于构建单源点的最短路径树(MST)——即树中某个点到任何其他点的距离都是最短的。例如,构建地图应用时查找自己的坐标离某个地标的最短距离。可以用于有向图,但是不能存在负权值(Bellman-Ford可以处理负权值)。

  • 伪代码
Dijkstra() {
    for each u in G,V {
        //此处做初始化操作,给每个节点u赋键值+∞,设置空为父节点
        u.key = +∞
        u.parent = NULL
    }
    //选初始点r,Q是无向图G中所有点V的权值优先队列,key可看作源点到u的距离
    r.key = 0
    Q = G,V
    while(Q != ∅) {
          //取出Q中权值最小值的点u
          u = extractMin(Q) 
          //取点u连接的所有节点(即无向图G的邻接表中的第u个链表)
          for each v ∈ G.Adj[u] {
              if (v ∈ Q) and (w(u, v) < key) {
                  //若该节点仍在Q中且权值w(w,v)小于其原始权值,则进行松弛操作!
                  v.parent = u
                  v.key = w(u, v) + u.key
              }
          }
      }
}

Prim简述

Prim算法用于构建最小生成树——即树中所有边的权值之和最小。例如,构建电路板,使所有边的和花费最少。只能用于无向图

  • 伪代码

//无向图G, 权值w, 起始点r
MST(G, w, r) {
for each u in G,V {
//此处做初始化操作,给每个节点u赋键值+∞,设置空为父节点
u.key = +∞
u.parent = NULL
}
//选初始点r,Q是无向图G中所有点V的权值优先队列,key可看作u到下一个节点v的距离
r.key = 0
Q = G,V
while(Q != ∅) {
//取出Q中权值最小值的点u
u = extractMin(Q)
//取点u连接的所有节点(即无向图G的邻接表中的第u个链表)
for each v ∈ G.Adj[u] {
if (v ∈ Q) and (w(u, v) < key) {
//若该节点仍在Q中且权值w(w,v)小于其原始权值,则进行松弛操作!
v.parent = u
v.key = w(u, v)
}
}
}
}


###异
MST中任意AB两点之间的距离,并不比原始图中AB的距离短,即原始图中可能存在边E(A,B)**小于**MST中的E(A,B)。
注意上述两个伪算法的差别只在于最后循环体内的**松弛操作**。
- 最小生成树只关心所有边的和最小,所以有v.key = w(u, v),即每个点**直连**其他点的最小值(**最多**只有两个节点之间的权值和)
- 最短路径树只搜索权值最小,所以有v.key = w(u, v) + u.key,即每个点到其他点的最小值(**最少**是两个节之间的权值和)

简单总结就是,Dijkstra的松弛操作加上了到起点的距离,而Prim只有相邻节点的权值。


###同
####思想
都是使用贪婪和线性规划,每一步都是选择权值/花费最小的边。
**贪婪**:一个局部最有解也是全局最优解;
**线性规划**:主问题包含n个子问题,而且其中有重叠的子问题。
Dijkstra算法通过线性规划缓存了最优子路径的解,每一步也通过贪婪算法来选择最小的边。
Prim算法通过贪婪来选择最小的边,而Prim的每个子树都是最小生成树说明满足线性规划的两个条件。

####时间复杂度
Time = θ( V \* T1 + E \* T2)
其中T1为取出键值最小点的时间,T2为降低键值的时间,取决于数据结构。
- 数组
T1= O(V), T2 = O(1), TIME = O(V \* V + E) = O(V \* V)
- 二叉堆
T1 = O(lgV), T2 = O(lgV), TIME = O(V \* lgV + E \* lgV) 
- 斐波那契堆
T1 = O(lgV), T2 = O(1), TIME =  O(V \* lgV + E) = O(V \* lgV)


对于**稀疏图**来说,E远小于V\*V,所以二叉堆比较好;
而对于**密集图**来说,E=V\*V,所以数组比较好;
**斐波那契堆**是最好的情况。

####Dijkstra特例
当边的权值都为1的时候,可以用DFS(广度优先搜索)优化时间复杂度。
- 使用FIFO(先进先出)队列代替优先队列,优化了降低键值T2的操作为O(1)
- 松弛操作改为

if d[v] = +∞ {
    d[v] = d[u] + 1
    enqueue(Q, v)
}
优化了取出键值最小点的时间T1 = O(1)

总的时间复杂度TIME = V + E
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 目录 1.贪心算法步骤 2.两个关键要素 3.两种背包问题3.1 0-1背包问题(适用于动态规划,不满足贪心选择性...
    王侦阅读 4,919评论 2 3
  • -DFS(Depth First Search):深度优先搜索 访问完一个顶点的所有邻接点之后,会按原路返回,对应...
    Spicy_Crayfish阅读 2,834评论 1 0
  • 楼上现在在装修,电钻的声音恨不得从楼上打通到楼下,令这个本来可以睡懒觉的早上显得不那么美好了。既然睡不着,那我们来...
    老街木阅读 230评论 0 2
  • 认真生活,努力工作,尽力提升自己,岁月总会让你遇见那个对的人! 2017年9月8日 星期五 晴 结束通话,苏沫...
    梦宇星月夜阅读 798评论 2 2
  • 庄子不二传 第六十一回 一代网红横空出世。不过这次不是美铝,而是一位叫“一哥”的机器人。 “一哥”由美...
    徐不二阅读 707评论 4 4