Dijkstra算法與Prim算法的異同

Dijkstra簡(jiǎn)述

Dijkstra算法用于構(gòu)建單源點(diǎn)的最短路徑樹(shù)(MST)——即樹(shù)中某個(gè)點(diǎn)到任何其他點(diǎn)的距離都是最短的怪得。例如柠新,構(gòu)建地圖應(yīng)用時(shí)查找自己的坐標(biāo)離某個(gè)地標(biāo)的最短距離。可以用于有向圖,但是不能存在負(fù)權(quán)值(Bellman-Ford可以處理負(fù)權(quán)值)。

  • 偽代碼
Dijkstra() {
    for each u in G,V {
        //此處做初始化操作签孔,給每個(gè)節(jié)點(diǎn)u賦鍵值+∞,設(shè)置空為父節(jié)點(diǎn)
        u.key = +∞
        u.parent = NULL
    }
    //選初始點(diǎn)r窘行,Q是無(wú)向圖G中所有點(diǎn)V的權(quán)值優(yōu)先隊(duì)列饥追,key可看作源點(diǎn)到u的距離
    r.key = 0
    Q = G,V
    while(Q != ?) {
          //取出Q中權(quán)值最小值的點(diǎn)u
          u = extractMin(Q) 
          //取點(diǎn)u連接的所有節(jié)點(diǎn)(即無(wú)向圖G的鄰接表中的第u個(gè)鏈表)
          for each v ∈ G.Adj[u] {
              if (v ∈ Q) and (w(u, v) < key) {
                  //若該節(jié)點(diǎn)仍在Q中且權(quán)值w(w,v)小于其原始權(quán)值,則進(jìn)行松弛操作罐盔!
                  v.parent = u
                  v.key = w(u, v) + u.key
              }
          }
      }
}

Prim簡(jiǎn)述

Prim算法用于構(gòu)建最小生成樹(shù)——即樹(shù)中所有邊的權(quán)值之和最小但绕。例如,構(gòu)建電路板惶看,使所有邊的和花費(fèi)最少捏顺。只能用于無(wú)向圖

  • 偽代碼

//無(wú)向圖G, 權(quán)值w, 起始點(diǎn)r
MST(G, w, r) {
for each u in G,V {
//此處做初始化操作纬黎,給每個(gè)節(jié)點(diǎn)u賦鍵值+∞幅骄,設(shè)置空為父節(jié)點(diǎn)
u.key = +∞
u.parent = NULL
}
//選初始點(diǎn)r,Q是無(wú)向圖G中所有點(diǎn)V的權(quán)值優(yōu)先隊(duì)列本今,key可看作u到下一個(gè)節(jié)點(diǎn)v的距離
r.key = 0
Q = G,V
while(Q != ?) {
//取出Q中權(quán)值最小值的點(diǎn)u
u = extractMin(Q)
//取點(diǎn)u連接的所有節(jié)點(diǎn)(即無(wú)向圖G的鄰接表中的第u個(gè)鏈表)
for each v ∈ G.Adj[u] {
if (v ∈ Q) and (w(u, v) < key) {
//若該節(jié)點(diǎn)仍在Q中且權(quán)值w(w,v)小于其原始權(quán)值拆座,則進(jìn)行松弛操作!
v.parent = u
v.key = w(u, v)
}
}
}
}


###異
MST中任意AB兩點(diǎn)之間的距離冠息,并不比原始圖中AB的距離短挪凑,即原始圖中可能存在邊E(A,B)**小于**MST中的E(A,B)。
注意上述兩個(gè)偽算法的差別只在于最后循環(huán)體內(nèi)的**松弛操作**逛艰。
- 最小生成樹(shù)只關(guān)心所有邊的和最小躏碳,所以有v.key = w(u, v),即每個(gè)點(diǎn)**直連**其他點(diǎn)的最小值(**最多**只有兩個(gè)節(jié)點(diǎn)之間的權(quán)值和)
- 最短路徑樹(shù)只搜索權(quán)值最小散怖,所以有v.key = w(u, v) + u.key菇绵,即每個(gè)點(diǎn)到其他點(diǎn)的最小值(**最少**是兩個(gè)節(jié)之間的權(quán)值和)

簡(jiǎn)單總結(jié)就是肄渗,Dijkstra的松弛操作加上了到起點(diǎn)的距離,而Prim只有相鄰節(jié)點(diǎn)的權(quán)值脸甘。


###同
####思想
都是使用貪婪和線性規(guī)劃,每一步都是選擇權(quán)值/花費(fèi)最小的邊偏灿。
**貪婪**:一個(gè)局部最有解也是全局最優(yōu)解丹诀;
**線性規(guī)劃**:主問(wèn)題包含n個(gè)子問(wèn)題,而且其中有重疊的子問(wèn)題翁垂。
Dijkstra算法通過(guò)線性規(guī)劃緩存了最優(yōu)子路徑的解铆遭,每一步也通過(guò)貪婪算法來(lái)選擇最小的邊。
Prim算法通過(guò)貪婪來(lái)選擇最小的邊沿猜,而Prim的每個(gè)子樹(shù)都是最小生成樹(shù)說(shuō)明滿足線性規(guī)劃的兩個(gè)條件枚荣。

####時(shí)間復(fù)雜度
Time = θ( V \* T1 + E \* T2)
其中T1為取出鍵值最小點(diǎn)的時(shí)間,T2為降低鍵值的時(shí)間啼肩,取決于數(shù)據(jù)結(jié)構(gòu)橄妆。
- 數(shù)組
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)


對(duì)于**稀疏圖**來(lái)說(shuō),E遠(yuǎn)小于V\*V祈坠,所以二叉堆比較好害碾;
而對(duì)于**密集圖**來(lái)說(shuō),E=V\*V赦拘,所以數(shù)組比較好慌随;
**斐波那契堆**是最好的情況。

####Dijkstra特例
當(dāng)邊的權(quán)值都為1的時(shí)候躺同,可以用DFS(廣度優(yōu)先搜索)優(yōu)化時(shí)間復(fù)雜度阁猜。
- 使用FIFO(先進(jìn)先出)隊(duì)列代替優(yōu)先隊(duì)列,優(yōu)化了降低鍵值T2的操作為O(1)
- 松弛操作改為

if d[v] = +∞ {
    d[v] = d[u] + 1
    enqueue(Q, v)
}
優(yōu)化了取出鍵值最小點(diǎn)的時(shí)間T1 = O(1)

總的時(shí)間復(fù)雜度TIME = V + E
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蹋艺,一起剝皮案震驚了整個(gè)濱河市剃袍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捎谨,老刑警劉巖笛园,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侍芝,居然都是意外死亡研铆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)州叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棵红,“玉大人,你說(shuō)我怎么就攤上這事咧栗∧嫣穑” “怎么了虱肄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)交煞。 經(jīng)常有香客問(wèn)我咏窿,道長(zhǎng),這世上最難降的妖魔是什么素征? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任集嵌,我火速辦了婚禮,結(jié)果婚禮上御毅,老公的妹妹穿的比我還像新娘根欧。我一直安慰自己,他們只是感情好端蛆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布凤粗。 她就那樣靜靜地躺著,像睡著了一般今豆。 火紅的嫁衣襯著肌膚如雪嫌拣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天呆躲,我揣著相機(jī)與錄音亭罪,去河邊找鬼。 笑死歼秽,一個(gè)胖子當(dāng)著我的面吹牛应役,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燥筷,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼箩祥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肆氓?” 一聲冷哼從身側(cè)響起袍祖,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谢揪,沒(méi)想到半個(gè)月后蕉陋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拨扶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年凳鬓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患民。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缩举,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仅孩,我是刑警寧澤托猩,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辽慕,受9級(jí)特大地震影響京腥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溅蛉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一公浪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧温艇,春花似錦因悲、人聲如沸堕汞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讯检。三九已至琐鲁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間人灼,已是汗流浹背围段。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留投放,地道東北人奈泪。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灸芳,于是被迫代替她去往敵國(guó)和親涝桅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄 1.貪心算法步驟 2.兩個(gè)關(guān)鍵要素 3.兩種背包問(wèn)題3.1 0-1背包問(wèn)題(適用于動(dòng)態(tài)規(guī)劃烙样,不滿足貪心選擇性...
    王偵閱讀 4,938評(píng)論 2 3
  • -DFS(Depth First Search):深度優(yōu)先搜索 訪問(wèn)完一個(gè)頂點(diǎn)的所有鄰接點(diǎn)之后冯遂,會(huì)按原路返回,對(duì)應(yīng)...
    Spicy_Crayfish閱讀 2,836評(píng)論 1 0
  • 樓上現(xiàn)在在裝修裸准,電鉆的聲音恨不得從樓上打通到樓下,令這個(gè)本來(lái)可以睡懶覺(jué)的早上顯得不那么美好了赔硫。既然睡不著狼速,那我們來(lái)...
    老街木閱讀 230評(píng)論 0 2
  • 認(rèn)真生活向胡,努力工作恼蓬,盡力提升自己,歲月總會(huì)讓你遇見(jiàn)那個(gè)對(duì)的人僵芹! 2017年9月8日 星期五 晴 結(jié)束通話处硬,蘇沫...
    夢(mèng)宇星月夜閱讀 807評(píng)論 2 2
  • 莊子不二傳 第六十一回 一代網(wǎng)紅橫空出世。不過(guò)這次不是美鋁拇派,而是一位叫“一哥”的機(jī)器人荷辕。 “一哥”由美...
    徐不二閱讀 710評(píng)論 4 4