Graph theory圖論 DFS、BFS演算法的統整與比較

更新於 發佈於 閱讀時間約 3 分鐘
raw-image

本篇文章將會著重在幾個圖論常用的演算法BFS 與 DFS 的統整與比較。


DFS 深度優先搜索: 先天具有一股腦往前探索一條路走到底的性質。

適合的底層資料結構:

Stack 或者 Recursion function 遞迴函式呼叫(站在人的觀點,比較好寫)

利用Stack 和 Recursion function時對應建立call stack的Last in First out性質,來維持深度優先的探索順序。

適合的應用領域:

  1. 尋找路徑的存在性(有一條路徑從起點走到終點即可)

例題:

Find if Path Exists in Graph — LeetCode

2. 在探索Tree/Binary tree相關的領域中,還有一個名字,叫做preorder前序/inorder中序/postorder後序 traversal,依照指定的順序拜訪整棵樹。

Binary Tree Preorder Traversal-Leetcode

Binary Tree Inorder Traversal-Leetcode

Binary Tree Postorder Traversal-Leetcode

3. 從樹根開始搜索到葉子節點,在這種題目中,其實DFS就是我們Single source path algorithm的模板,把Root視為探索的起點。

例如 Path sum系列的題目

Path Sum — LeetCode

Path Sum II — LeetCode

Path Sum III — LeetCode

4. 展開整個搜索空間(Search space/State space)的題目,常常結合回溯法backtracking一起使用,適合子集合組合直線排列...等類型的題目。

Subsets — Leetcode

Combinations — Leetcode

Permutations — Leetcode


BFS 廣度優先: 先天具有點播源擴散的性質,起點視為波源,由內往外一層一層擴散,抵達終點時的擴散層數就代表最短路徑

適合的底層資料結構:

Queue 佇列,利用佇列First in First out的特性,來維持廣度優先 level by level探索的前後順序。

  1. 無權重圖或者圖中權重默認相等的最短路徑

Shortest path in binary matrix -Leetcode

Shortest path to get all keys — Leetcode

2. 在探索Tree/Binary tree相關的領域中,還有一個名字,叫做Level-order traversal 逐層探索演算法。從第一層Root根接點,逐層探索到Leaf葉子節點 也是最深的那一層。

Binary Tree Level Order Traversal — Leetcode

Time Needed to Inform All Employees — LeetCode

3. 點波源擴散的模式,探索整張圖。也可以用這個性質來尋找起終點的路徑是否存在。

Find if Path Exists in Graph — LeetCode


avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Coin Change + DP 策略_Leetcode 面試題 上機考 題目 詳細解說
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
※ 查找 DOM 元素有兩種途徑: 直接選出一個節點 (select):要在樹狀結構裡查找資料,至少要先選出第一個元素。 從一個特定節點,查找到週邊的節點 :選出一個元素後,就可以順著結構找出父元素、子元素 、甚至同一層的兄弟元素,這種行為稱為「遍歷 (traverse)」。 ※ 選出特定 D
Thumbnail
不同的運算子一起出現時,會根據其優先性(Precedence)來決定誰先誰後。MDN也很貼心的整理成表格了。 雖然有表格可以供我們查找,但是總不可能每一次用到運算子的時候,我們都去查找吧?我們最好對這張表有直觀上的理解與記憶。 那麼就讓我來分享我如何理解與記憶這張表吧! 運算子在做甚麼
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
我們的思維常常呈現網狀結構,涉及大量相關訊息,表達和行動需要線性思維,而網狀思維與線性思維不相匹配,中間隔著關鍵的一步,即讓網狀思維變得有邏輯和組織。 金字塔原理的核心價值就在於找到一套系統方法,建構一個層級清晰、邏輯清晰的樹狀思維。 只有完成這一步,從思考到表達、從思考到行動的道路才算是完整的。
Thumbnail
因果鏈分析核心是追根究底挖掘問題的深層次原因。這方法將問題視為一個層層相扣的結構,通過系列問答,從表面的不利因素一直追溯到問題根源。口訣「追根究底挖問題,解碼問題的本質」提醒初學者關鍵概念,強調追根究底、不遺漏任何原因、用[且]或[或]運算,連接上下層不利因素之間的關係,建立徹底解決問題的強力基礎。
大腦本身也符合第一性原理,其本質就在一切的結果裡。
Thumbnail
本文將繼續探討『系統思考』一書更深入的説明,以及作者在動態系統分析中所萃煉出來的獨到見解。 中文書名:系統思考:克服盲點、面對複雜性、見樹又見林的整體思考 原文書名:Thinking in Systems: A Primer 作者:Donella H. Meadows
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
上次我們提到了演算法(algorithm),它是一種解決問題的方式。但演算法只是資料結構與演算法(Data Structures and Algorithms, DSA)這個領域的一部分。今天,我們要進一步探索這個主題,了解它的核心概念。 什麼是資料結構與演算法呢?簡單來說,資料結構是用來組織和存
※ 查找 DOM 元素有兩種途徑: 直接選出一個節點 (select):要在樹狀結構裡查找資料,至少要先選出第一個元素。 從一個特定節點,查找到週邊的節點 :選出一個元素後,就可以順著結構找出父元素、子元素 、甚至同一層的兄弟元素,這種行為稱為「遍歷 (traverse)」。 ※ 選出特定 D
Thumbnail
不同的運算子一起出現時,會根據其優先性(Precedence)來決定誰先誰後。MDN也很貼心的整理成表格了。 雖然有表格可以供我們查找,但是總不可能每一次用到運算子的時候,我們都去查找吧?我們最好對這張表有直觀上的理解與記憶。 那麼就讓我來分享我如何理解與記憶這張表吧! 運算子在做甚麼
Thumbnail
上篇進一步認識基本的圖形架構與三大 Graph 算法,那首先從 shortest path 開始,我們會陸續去理解這些算法,以及可能的應用,如果還沒有看過上一篇的,可以點以下連結~那我們就開始吧! 【圖論Graph】Part1:初探圖形與圖形演算法之應用
Thumbnail
我們的思維常常呈現網狀結構,涉及大量相關訊息,表達和行動需要線性思維,而網狀思維與線性思維不相匹配,中間隔著關鍵的一步,即讓網狀思維變得有邏輯和組織。 金字塔原理的核心價值就在於找到一套系統方法,建構一個層級清晰、邏輯清晰的樹狀思維。 只有完成這一步,從思考到表達、從思考到行動的道路才算是完整的。
Thumbnail
因果鏈分析核心是追根究底挖掘問題的深層次原因。這方法將問題視為一個層層相扣的結構,通過系列問答,從表面的不利因素一直追溯到問題根源。口訣「追根究底挖問題,解碼問題的本質」提醒初學者關鍵概念,強調追根究底、不遺漏任何原因、用[且]或[或]運算,連接上下層不利因素之間的關係,建立徹底解決問題的強力基礎。
大腦本身也符合第一性原理,其本質就在一切的結果裡。
Thumbnail
本文將繼續探討『系統思考』一書更深入的説明,以及作者在動態系統分析中所萃煉出來的獨到見解。 中文書名:系統思考:克服盲點、面對複雜性、見樹又見林的整體思考 原文書名:Thinking in Systems: A Primer 作者:Donella H. Meadows