天天看點

資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

圖結構-----Floyd算法

1、前言

根據計算機考研中對于求解最短路徑算法的出題形式,以Dijkstra算法為重要考點,Dijkstra算法對于求解一個頂點到其他任意的頂點之間的最短路徑的問題,可以說是非常實用。

同時對于求解各個端點到其他端點的最短路徑的集合這個問題,Dijkstra算法便沒有那麼優勢了,本着學習就要學全面的特點,下面對Floyd算法進行原理講解,(隻講執行過程,不涉及到算法的代碼實作)

2、算法介紹

時間複雜度介紹
  1. 相比于Dijkstra算法,Floyd算法的時間複雜度是非常高的。
  2. 時間複雜度為O(n3),(n的三次方),其時間複雜度是非常的高。
算法執行準備
  1. 首先給出要講解的題目例子圖如下:
資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

2. Floyd算法的執行過程需要我們在草稿紙上畫出,兩個矩陣,一個是上圖中的邊與邊對應的權值關系,另一個是節點指向節點的路徑顯示,是以給出兩個矩陣結構圖如下:

資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

3. 準備好初始的矩陣的條件節點後,我們對其進行Floyd算法的執行分析:

Floyd算法執行過程
  1. 首先是選取第二個矩陣中的初始路徑,這裡以第一行中的A->B為開始操作路徑。
  2. Floyd算法第一步---------在A->B選擇路徑後,加入節點C,對其目前的矩陣中的所有節點進行路徑的更新
  3. 更新的原則:若加入了C,使得其中的一個路徑長度變短,便更新,否則不更新。
  4. 其第一輪更新過程圖如下:
資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

根據上述圖檔對其進行第一輪的加入C節點進行操作分析:

  1. 找到不帶C節點的路徑,對于目前的路徑長度跟加入C節點後的路徑長度進行對比
  2. 若小于目前的路徑長度,則更新該位置
  3. 若不小于則保持原型

下面進行第二輪更新,選擇加入B節點:其執行圖如下:

資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

以上是第二輪加入B節點進行矩陣更新後的第二輪流程:

最後是最後一輪加入節點A,由于其中一共有三個節點,是以隻需要執行三輪,這裡有幾個節點就要幾輪操作。

第三輪更新:加入A節點

執行圖如下:

資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

其Floyd執行算法的流程如下,其思路了解掌握就好,代碼時間複雜度n的三次方有點高,有需要可以了解下。

資料結構<圖>-------------Floyd算法(這次無代碼,加入一個算法的實作流程思路)

繼續閱讀