工程師應該學點算法——圖論2

本文原創首發於公衆號【編程三分鐘】算法

爲何QQ要給女友推送前女朋友?這仍是從圖的算法提及。前篇 -> 圖論1數據庫

圖的遍歷

在圖的遍歷中咱們必定要掌握兩種最基礎的算法:深度優先 和 廣度優先。編程

深度優先遍歷(DFS)

這種遍歷算法能夠想象成在玩迷宮,咱們選擇一個方向走到底,直至不能走了而後再返回一步繼續嘗試其餘的方向,在代碼中就是遞歸+回溯,這就是 深度優先遍歷。數組

走過的點要作標記,標記過的不會再重複嘗試,好比 0 -> 1,1 -> 0,不然已經走過的點 0 和 1 就會重複通過,陷入死循環。網絡

如上圖,從任何一個頂點開始,這裏從 0 ,隨機一個方向走下一步,將遍歷過的點標記,之後再也不走,直到走到盡頭,再回退(回溯)一個點,這樣咱們就能夠實現深度優先的遍歷。.net

如上圖有兩個數組,左邊用一個數組記錄了遍歷的路徑,索引是節點,值是父節點位置,右邊的數組記錄了是否已經標記過,T 表明是,f 表明否。 沒看懂?不要緊,我一步一步的寫出來, 舉例以下:blog

廣度優先遍歷(BFS)

廣度優先遍歷同深度優先不一樣,他的主旨是先遍歷同級,再遍歷下級。相似於樹的層遍歷。 方法是每遍歷一個點,優先把他的全部子節點加入到隊尾,再從隊頭取出一個點出來,這樣能夠保證優先遍歷同層, 直至隊列爲空 走過的點依然要標記,防止死循環。 以下圖,從0開始遍歷。遞歸

以下表所示,我先將1入隊列索引

說那麼多不如來作作題!token

解救美女

有一天,小美和你去玩迷宮,可是方向感很差的小美很快就迷路了,你得知以後便去營救,你已經弄清楚了迷宮的地圖

  1. BFS廣度優先解決: 如今你要知道你從當前位置出發是否可以到達小美的位置。
  2. DFS深度度優先解決: 如今要求你以最快的速度去解救小美,你能計算出最快須要幾步麼?以及求出其最快的路徑。

  • 1表示地圖上的障礙物,0表示有路能夠走
  • 鄰接矩陣(二維數組):

圖的應用

社交網絡:QQ推薦好友功能 知識圖譜:推薦算法,數據挖掘 圖數據庫:Neo4j 路徑問題:導航軟件

推薦閱讀: 爲何QQ能幫你找到失散多年的兄弟?----圖論 天天三分鐘玩轉Git(完結) promethus與監控系統

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索