最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Dijkstra算法與Prim算法的異同案例詳解

 更新時間:2021年09月06日 09:14:58   作者:豆沙包lo  
這篇文章主要介紹了Dijkstra算法與Prim算法的異同案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

Dijkstra簡述

Dijkstra算法用于構(gòu)建單源點的最短路徑樹(MST)——即樹中某個點到任何其他點的距離都是最短的。例如,構(gòu)建地圖應用時查找自己的坐標離某個地標的最短距離??梢杂糜谟邢驁D,但是不能存在負權(quán)值(Bellman-Ford可以處理負權(quán)值)。

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

Prim簡述

Prim算法用于構(gòu)建最小生成樹——即樹中所有邊的權(quán)值之和最小。例如,構(gòu)建電路板,使所有邊的和花費最少。只能用于無向圖。

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

MST中任意AB兩點之間的距離,并不比原始圖中AB的距離短,即原始圖中可能存在邊E(A,B)**小于**MST中的E(A,B)。

注意上述兩個偽算法的差別只在于最后循環(huán)體內(nèi)的松弛操作。

  • 最小生成樹只關(guān)心所有邊的和最小,所以有v.key = w(u, v),即每個點直連其他點的最小值(最多只有兩個節(jié)點之間的權(quán)值和)
  • 最短路徑樹只搜索權(quán)值最小,所以有v.key = w(u, v) + u.key,即每個點到其他點的最小值(最少是兩個節(jié)之間的權(quán)值和)

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

思想

都是使用貪婪和線性規(guī)劃,每一步都是選擇權(quán)值/花費最小的邊。
貪婪:一個局部最有解也是全局最優(yōu)解;
線性規(guī)劃:主問題包含n個子問題,而且其中有重疊的子問題。

Dijkstra算法通過線性規(guī)劃緩存了最優(yōu)子路徑的解,每一步也通過貪婪算法來選擇最小的邊。
Prim算法通過貪婪來選擇最小的邊,而Prim的每個子樹都是最小生成樹說明滿足線性規(guī)劃的兩個條件。

時間復雜度

Time = θ( V * T1 + E * T2)
其中T1為取出鍵值最小點的時間,T2為降低鍵值的時間,取決于數(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)

對于稀疏圖來說,E遠小于V*V,所以二叉堆比較好;
而對于密集圖來說,E=V*V,所以數(shù)組比較好;
斐波那契堆是最好的情況。

Dijkstra特例

當邊的權(quán)值都為1的時候,可以用DFS(廣度優(yōu)先搜索)優(yōu)化時間復雜度。

  • 使用FIFO(先進先出)隊列代替優(yōu)先隊列,優(yōu)化了降低鍵值T2的操作為O(1)
  • 松弛操作改為
    if d[v] = +∞ {
        d[v] = d[u] + 1
        enqueue(Q, v)
    }

優(yōu)化了取出鍵值最小點的時間T1 = O(1)

總的時間復雜度

TIME = V + E

到此這篇關(guān)于Dijkstra算法與Prim算法的異同案例詳解的文章就介紹到這了,更多相關(guān)Dijkstra算法與Prim算法的異同內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言如何改變字體顏色

    C語言如何改變字體顏色

    這篇文章主要介紹了C語言如何改變字體顏色,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • C/C++浮點數(shù)使用的兩個注意事項詳解

    C/C++浮點數(shù)使用的兩個注意事項詳解

    浮點數(shù)都是有符號的,沒有 unsigned 浮點數(shù),下面這篇文章主要給大家介紹了關(guān)于C/C++浮點數(shù)使用的兩個注意事項,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C++實現(xiàn)LeetCode(187.求重復的DNA序列)

    C++實現(xiàn)LeetCode(187.求重復的DNA序列)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(187.求重復的DNA序列),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++函數(shù)重載介紹與原理詳解

    C++函數(shù)重載介紹與原理詳解

    這篇文章主要為大家介紹了C++函數(shù)重載介紹與原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Qt實現(xiàn)卡牌對對碰游戲(附demo)

    Qt實現(xiàn)卡牌對對碰游戲(附demo)

    本文主要介紹了Qt實現(xiàn)卡牌對對碰游戲,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10
  • 一文搞懂Codec2框架解析

    一文搞懂Codec2框架解析

    這篇文章主要介紹了Codec2框架解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式

    C++實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式

    這篇文章主要為大家詳細介紹了C++實現(xiàn)中綴表達式轉(zhuǎn)后綴表達式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    C++深入探索內(nèi)聯(lián)函數(shù)inline與auto關(guān)鍵字的使用

    本篇文章主要包括內(nèi)聯(lián)函數(shù)和auto關(guān)鍵字。其中,內(nèi)斂函數(shù)包括概念,特性等;auto關(guān)鍵字的使用規(guī)則,使用場景等,接下來讓我們深入了解
    2022-05-05
  • c++ signal實現(xiàn)發(fā)送信號

    c++ signal實現(xiàn)發(fā)送信號

    這篇文章主要為大家詳細介紹了c++ signal實現(xiàn)發(fā)送信號的相關(guān)知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • C++實現(xiàn)LeetCode(21.混合插入有序鏈表)

    C++實現(xiàn)LeetCode(21.混合插入有序鏈表)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(21.混合插入有序鏈表),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

平乡县| 开原市| 房产| 红桥区| 天镇县| 宁城县| 太康县| 永清县| 舒兰市| 大洼县| 宁国市| 固始县| 兴文县| 轮台县| 山东| 怀远县| 蒙自县| 界首市| 耒阳市| 湟中县| 马山县| 成安县| 彰化县| 玛沁县| 江津市| 金寨县| 贞丰县| 龙江县| 阿克| 巴里| 孝感市| 绥江县| 文水县| 丰都县| 龙泉市| 万全县| 获嘉县| 德惠市| 阜阳市| 尉犁县| 抚远县|