# 如何進行數據結構之圖的深度優先搜索
## 一、深度優先搜索(DFS)概述
深度優先搜索(Depth-First Search, DFS)是圖遍歷算法中最經典的算法之一,其核心思想是"一條路走到黑,再回頭探索"。該算法會盡可能深地探索圖的分支,直到當前分支所有節點都被訪問過,再回溯到上一個節點繼續探索未訪問的分支。
### 1.1 基本特點
- 后進先出的探索方式(天然適合棧結構實現)
- 時間復雜度:O(V+E)(V為頂點數,E為邊數)
- 空間復雜度:O(V)(最壞情況下需要存儲整條路徑)
## 二、DFS算法實現步驟
### 2.1 遞歸實現(最直觀的方式)
```python
def dfs_recursive(graph, node, visited=None):
if visited is None:
visited = set()
visited.add(node)
print(node) # 處理當前節點
for neighbor in graph[node]:
if neighbor not in visited:
dfs_recursive(graph, neighbor, visited)
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
node = stack.pop()
if node not in visited:
visited.add(node)
print(node) # 處理當前節點
# 注意壓棧順序與遞歸順序相反
for neighbor in reversed(graph[node]):
if neighbor not in visited:
stack.append(neighbor)
必須使用訪問標記(visited集合)來防止: - 無向圖中的來回震蕩 - 有向圖中的環路導致的無限循環
根據業務需求選擇鄰接節點的訪問順序: - 升序/降序排列(影響生成樹形態) - 加權圖中的優先級處理
def dfs_disconnected(graph):
visited = set()
for node in graph:
if node not in visited:
dfs_recursive(graph, node, visited)
def find_path(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
for node in graph[start]:
if node not in path:
newpath = find_path(graph, node, end, path)
if newpath:
return newpath
return None
def topological_sort(graph):
visited = set()
result = []
def dfs(node):
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
dfs(neighbor)
result.append(node) # 后序添加
for node in graph:
if node not in visited:
dfs(node)
return result[::-1] # 反轉結果
def has_cycle(graph):
visited = set()
recursion_stack = set()
def dfs(node):
visited.add(node)
recursion_stack.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
if dfs(neighbor):
return True
elif neighbor in recursion_stack:
return True
recursion_stack.remove(node)
return False
for node in graph:
if node not in visited:
if dfs(node):
return True
return False
結合BFS和DFS優點,適用于狀態空間未知的情況:
def ids(graph, start, max_depth):
for depth in range(max_depth):
visited = set()
if dls(graph, start, depth, visited):
return True
return False
def dls(graph, node, depth, visited):
if depth == 0 and node == target:
return True
if depth > 0:
visited.add(node)
for neighbor in graph[node]:
if neighbor not in visited:
if dls(graph, neighbor, depth-1, visited):
return True
return False
特性 | DFS | BFS |
---|---|---|
數據結構 | 棧 | 隊列 |
空間復雜度 | O(h)(h為最大深度) | O(w)(w為最大寬度) |
適用場景 | 拓撲排序、連通性檢測 | 最短路徑、層級遍歷 |
深度優先搜索通過其”縱向深入”的探索方式,成為解決圖論問題的利器。掌握DFS需要理解: 1. 遞歸調用棧的本質 2. 回溯機制的應用場景 3. 剪枝優化的實際價值
建議讀者通過LeetCode典型題目(如200.島嶼數量、207.課程表等)進行實踐訓練,加深對DFS的理解和應用能力。 “`
注:本文實際約1100字,包含代碼示例、對比表格和結構化說明??筛鶕枰鰷p代碼示例或添加可視化圖示(如DFS遍歷過程的樹形圖)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。