十個基礎圖論演算法介紹 - Franc0

banq發表於2021-12-03

10個基本的圖演算法:

bfs廣度優先搜尋:
這是一種遍歷演算法。它從給定的頂點開始,並在移動到下一層的頂點之前探索當前級別的所有鄰居。它是使用佇列資料結構實現的。
用途:

  • 確定未加權圖中的最短路徑和最小生成樹
  • 構建網頁索引
  • 在社交網路上搜尋
  •  在對等網路中找到可用的鄰居節點

 

dfs深度優先搜尋:
這是一種遍歷演算法。它從給定的頂點開始,並在回溯之前沿著每個分支儘可能地探索。它是使用堆疊資料結構實現的。
用途:

  • 找到 2 個頂點之間的路徑
  • 檢測圖中的迴圈 
  • 拓撲排序
  • 解決迷宮難題

 
最短路徑:

在 2 個給定頂點之間找到一條路徑,使得應該經過的邊的權重之和最小。有兩種主要演算法:

  1. Dijkstra
  2. Bellman–Ford

用途:
  • 在地圖軟體中查詢從一個位置到另一位置的行進方向
  • 解決網路中的最小延遲路徑問題
  • 透過不同狀態之間的轉換確定到達目標狀態的選擇

 

迴圈檢測:
檢測是否存在首尾頂點相同的路徑。有兩種主要演算法:

  1. 弗洛伊德迴圈檢測
  2. 布倫特

用途:
  • 基於分散式訊息的演算法 
  • 檢測併發系統中的死鎖 
  • 在分散式叢集上處理大規模圖 
  • 確定可以將訊息對映到相同加密值的鍵。

 

最小生成樹:
找到連線所有頂點的邊的子集,沒有迴圈的權重總和最小。有兩種主要演算法:

  1. Prim
  2. Kruskal

用途:
  • 影像註冊
  • 避免網路迴圈的協議
  • 基於圖形的資料叢集的分析

 

 強連線部件
尋找頂點的子集,其中每個頂點都可以從其他每個頂點到達。
有2種主要演算法:

  1. Kosaraju
  2. Tarjan

用途:
  • 對二元圖的邊進行分類
  • 形式驗證中的模型檢查。
  • 在社交網路中找到強聯絡的人群,並根據共同興趣進行推薦

  

拓撲排序 
找到一個DAG中頂點的線性排序,使排序中的每條有向邊(x,y),頂點x都在y之前。
有2種主要演算法。

  1. Kahn
  2. 深度優先搜尋

用途:
  • 指令排程
  • 資料序列化
  • 確定編譯任務的順序
  • 解決連結器中的符號依賴問題

 

圖形著色:
為頂點(或邊)分配k種顏色,同時確保任何兩個相鄰的頂點(或邊)不具有相同的顏色。
有2種主要演算法。

  1. 廣度優先搜尋
  2. 深度優先搜尋

用途:
  • 檢查一個圖是否是二方bipartite的
  • 著色日程安排時間表
  • 分配移動無線電頻率
  • 給國家的地理地圖著色

  

最大流動
一個圖也可以被建模為一個流動網路,邊的權重為流動能力。最大流動是指能夠獲得最大可能流量的流動路徑。
有3種主要演算法。

  1. 福特-福爾克森 
  2. 埃德蒙茲-卡普 
  3. Dinic

用途:
  • 流通需求問題
  • 航空公司的機組人員安排
  • 拋棄那些在剩下的比賽中無法到達當前領導者的團隊
  • 影像分割以區分影像中的背景和前景

 

匹配 
尋找沒有共同頂點的邊的子集。
有3種主要演算法:

  1.  Hopcroft-Karp
  2.  Hungarian
  3.  Blossom

用途:
  • 在兩組人之間牽線搭橋
  • 資源分配問題
  • 旅行中的資源分配和最佳化







 

相關文章