圖已經成爲一種強大的建模和捕獲真實場景中的數據的手段,好比社交媒體網絡、網頁和連接,以及GPS中的位置和路線。若是您有一組相互關聯的對象,那麼您可使用圖來表示它們。算法
在這篇文章中,我將簡要地解釋10個對分析和應用很是有用的基本圖形算法。
微信
首先,讓咱們介紹圖。網絡
什麼是圖?
圖由一組有限的頂點或節點和一組鏈接這些頂點的邊組成。若是兩個頂點經過同一條邊互相鏈接,則稱它們爲鄰接。數據結構
下面給出了一些與圖相關的基本定義。您能夠參考圖1中的示例。併發
Order:圖中頂點的數量分佈式
Size:圖中的邊數ide
Vertex degree:與一個頂點關聯的邊的數量oop
Isolated vertex:圖中與其餘頂點沒有鏈接的頂點優化
Self-loop:從頂點到自身的一條邊動畫
Directed graph:全部的邊都有一個方向來表示起始點和結束點的圖
Undirected graph:具備沒有方向的邊的圖
Weighted grap:圖的邊具備權值
Unweighted graph:圖的邊沒有權值
廣度優先搜索(Breadth-first search)
遍歷或搜索是可在圖上執行的基本操做之一。在廣度優先搜索(BFS)中,咱們從一個特定的頂點開始,在進入下一層的頂點以前探索它當前深度的全部鄰居。與樹不一樣,圖能夠包含循環(第一個和最後一個頂點是相同的路徑)。所以,咱們必須跟蹤訪問過的頂點。在實現BFS時,咱們使用隊列數據結構。
圖2表示一個示例圖的BFS遍歷的動畫。注意頂點是如何被發現(黃色)和被訪問(紅色)的。
應用
用於肯定最短路徑和最小生成樹。
被搜索引擎爬蟲用來創建網頁的索引。
用來在社交網絡上搜索。
用於查找可用的鄰接節點在對等網絡,如BitTorrent。
深度優先搜索 (Depth-first search)
在深度優先搜索(DFS)中,咱們從一個特定的頂點開始,在回溯(backtracking)以前沿着每一個分支儘量地搜索。在DFS中,咱們還須要跟蹤訪問過的頂點。在實現DFS時,咱們使用堆棧數據結構來支持回溯。
圖3表示對圖2中使用的同一個示例圖進行DFS遍歷的動畫。注意它是如何遍歷到深度和回溯的。
應用
用於查找兩個頂點之間的路徑。
用於檢測圖中的循環。
用於拓撲排序。
用於解決只有一個解的謎題(如迷宮)
最短路徑
從一個頂點到另外一個頂點的最短路徑是圖中應該移動的邊的權值總和最小的路徑。
圖4顯示了一個動畫,其中肯定了圖中頂點1到頂點6的最短路徑。
算法
Dijkstra的最短路徑算法 、bellman算法
應用
用於在谷歌maps或Apple maps等地圖軟件中查找從一個地方到另外一個地方的路線。
用於網絡中解決最小時延路徑問題。
在抽象機器中,經過不一樣狀態之間的轉換來肯定達到某一目標狀態的選擇(例如,能夠用來肯定贏得一場比賽的最小可能的走法數)。
循環檢測 Cycle Detection
循環是圖中第一個頂點和最後一個頂點相同的路徑。若是咱們從一個頂點出發,沿着一條路徑,最後到達起始點,那麼這條路徑就是一個循環。循環檢測是檢測這些循環的過程。圖5顯示了遍歷一個循環的動畫。
算法
Floyd週期檢測算法、布倫特算法
應用
用於基於消息的分佈式算法。
用於使用集羣上的分佈式處理系統處理大規模圖形。
用於檢測併發系統中的死鎖。
在加密應用程序中用於肯定能夠將消息映射到相同加密值的消息的密鑰。
最小生成樹
最小生成樹是圖的邊的子集,它鏈接全部邊權值最小和的頂點,不包含任何循環。
圖6是一個顯示得到最小生成樹的過程的動畫。
算法
Prim算法、Kruskal算法
應用
用於在計算機網絡中構建廣播樹。
用於基於圖的聚類分析。
用於圖像分割。
用於社會地理區域的區域化,將區域劃分爲相鄰區域。
強連通份量(strongly connected components)
若是圖中的每一個頂點都能從其餘每一個頂點到達,那麼這個圖就是強連通的。
圖7顯示了一個示例圖,其中包含三個強鏈接的組件,頂點用紅色、綠色和黃色表示。
算法
Kosaraju的算法、Tarjan的強連通份量算法
應用
用於計算Dulmage-Mendelsohn分解,它是徹底二分圖的一種分類。
在社交網絡中,用來尋找一羣關係密切的人,並根據共同的興趣提出建議。
拓撲排序
圖的拓撲排序是對它的頂點進行線性排序,所以對於排序中的每條有向邊(u, v),頂點u都在v以前。
圖8顯示了頂點(一、二、三、五、四、六、七、8)的拓撲排序示例。能夠看到頂點5應該在頂點2和3以後。相似地,頂點6應該在頂點4和5以後。
算法
Kahn算法基於深度優先搜索的算法
應用
用於指令調度。
用於數據序列化。
用於肯定在makefile中執行的編譯任務的順序。
用於解析連接器中的符號依賴關係。
圖着色
圖着色在保證必定條件下給圖的元素分配顏色。頂點着色是最經常使用的圖形着色技術。在頂點着色中,咱們嘗試用k種顏色給圖的頂點着色,任何兩個相鄰的頂點都不該該有相同的顏色。其餘着色技術包括邊緣着色和臉部着色。
圖的色數是爲圖着色所需的顏色的最小數目。
圖9顯示了使用4種顏色的示例圖的頂點着色。
算法
使用廣度優先搜索或深度優先搜索的算法、貪婪着色
應用
用於制定時間表。
用於分配移動無線電頻率。
用於模擬和解決遊戲,如數獨。
用於檢查圖是不是二分圖。
用於在相鄰國家或州的地理地圖上塗上不一樣顏色。
最大流(Maximum Flow)
咱們能夠將一個圖建模爲一個以邊權值做爲流量容量的流網絡。在最大流量問題中,咱們必須找到一個能得到最大可能流量的流動路徑。
圖10顯示了一個肯定網絡的最大流量和最終流量值的動畫示例。
算法
Ford-Fulkerson算法、Edmonds-Karp算法、Dinic的算法
應用
用於航空公司調度,安排航班機組人員。
用於圖像分割,在圖像中找到背景和前景。
用來淘汰那些不能贏得足夠的比賽來遇上當前分區的球隊。
匹配
圖中的匹配是指一組沒有共同頂點的邊(也就是說,沒有兩條邊共享一個共同頂點)。若是一個匹配包含儘量多的頂點匹配的邊的最大數量,那麼這個匹配被稱爲最大匹配。
圖11顯示了得到一個二分圖的徹底匹配的動畫,該二分圖有兩組頂點,分別用橙色和藍色表示。
算法
Hopcroft-Karp算法、匈牙利算法、Blossom 算法
應用
用於爲新娘和新郎牽線搭橋(婚姻的穩定問題)。
用於肯定頂點覆蓋。
用於交通理論中解決出行資源配置和優化問題。
最後
我但願這篇文章對圖形算法的簡單歸納介紹對您有所幫助
做者:Vijini Mallawaarachchi
deephub翻譯組
本文分享自微信公衆號 - DeepHub IMBA(deephub-imba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。