學習資料結構 - 深度優先搜尋 DFS 記錄
深度優先搜尋(Depth-First Search,DFS)是一種用於遍歷或搜尋樹和圖的演算法。在最壞的情況下,深度優先搜尋的效能為 O(V+E),其中 V 是頂點數,E 是邊數。DFS 常用於解決連通性問題、路徑問題、生成樹問題等。
DFS 的使用步驟
初始化:建立一個資料結構(如棧)來儲存遍歷過程中訪問的節點。
訪問起始節點:將起始節點新增到棧中,並標記為已訪問。
探索鄰居:從棧頂取出一個節點,檢查其所有未訪問的鄰居節點。
遞迴或迭代:對每一個未訪問的鄰居節點,將其新增到棧中,並將其標記為已訪問。
重複探索:重複步驟 3 和 4,直到棧為空。
結束條件:當棧為空且沒有更多節點可以訪問時,搜尋結束。
DFS 的實現
DFS 可以用遞迴或非遞迴(迭代)的方式實現。
遞迴實現:
def dfs(graph, node, visited=None):
if visited is None:
visited = set()
visited.add(node)
print(node) # 處理節點
for neighbour in graph[node]:
if neighbour not in visited:
dfs(graph, neighbour, visited)
return visited
非遞迴實現(使用棧):
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
node = stack.pop()
if node not in visited:
print(node) # 處理節點
visited.add(node)
stack.extend(graph[node] - visited) # 新增未訪問的鄰居到棧中
return visited
DFS 的深度最佳化
剪枝:在搜尋過程中,如果確定某個節點不可能產生有效結果,可以提前終止對該節點的搜尋。
啟發式搜尋:在搜尋過程中使用啟發式資訊來指導搜尋方向,減少搜尋空間。
迭代加深:結合 DFS 和 BFS 的優點,透過限制搜尋深度來減少記憶體使用,並在必要時增加深度。
使用點陣圖或雜湊表:使用點陣圖或雜湊表來快速檢查節點是否已訪問。
最佳化鄰接表儲存:使用合適的資料結構來儲存圖的鄰接表,如鄰接表或鄰接矩陣,根據實際情況選擇。
並行搜尋:在多處理器或多執行緒環境中,可以並行地執行 DFS 搜尋。
實戰案例
假設我們要在一個圖中找到一個節點到另一個節點的路徑。
構建圖:首先,根據問題描述構建圖的鄰接表。
呼叫 DFS:從起始節點開始呼叫 DFS 函式。
回溯:在 DFS 中,如果當前路徑包含了目標節點,記錄路徑並回溯。
路徑恢復:透過回溯過程,可以從棧或遞迴呼叫鏈中恢復路徑。
透過 DFS,可以有效地找到圖中的路徑,解決許多圖論問題。在實際應用中,根據問題的特點和約束,可以對 DFS 進行適當的最佳化,以提高搜尋效率。本篇只是入門級的,更深層次的應用,後面會持續更新,歡迎大家提意見!!!
相關文章
- DFS(深度優先搜尋)
- 【演算法】深度優先搜尋(DFS)演算法
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 深度優先搜尋演算法-dfs講解演算法
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 深度優先搜尋(DFS)思路及演算法分析演算法
- 深度優先搜尋
- 小白的深度優先搜尋(Depth First Search)學習日記(Python)Python
- ybtoj:深度優先搜尋
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- 遞迴——深度優先搜尋(DFS)——以滑雪問題為例(自頂而下)遞迴
- leetcode 刷題之深度優先搜尋LeetCode
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 資料結構和演算法學習筆記七:圖的搜尋資料結構演算法筆記
- 再來一篇深度優先遍歷/搜尋總結?
- 【資料結構】搜尋樹資料結構
- 深度和廣度優先搜尋演算法演算法
- 【知識點】深度優先搜尋 Depth First Search
- 資料結構學習筆記-先序遍歷森林資料結構筆記
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 關於樹的資料結構(二分搜尋樹,堆和優先佇列)資料結構佇列
- 【程式碼隨想錄】廣度優先搜尋
- 從1到n的全排列(深度優先搜尋)
- 資料結構學習系列之二叉搜尋樹詳解!資料結構
- 深度學習的未來:神經架構搜尋深度學習架構
- 演算法筆記(廣度優先搜尋)演算法筆記
- bfs廣度優先搜尋
- ybtoj:廣度優先搜尋
- 資料結構學習筆記資料結構筆記
- 資料結構-二分搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構