先说明:广度优先搜索(BFS)就是宽度优先搜索,二者通常没有区别;真正相对的是 深度优先搜索(DFS)。所以严格说只有 DFS 和 BFS 两类。下面写三段代码:DFS、BFS(广度/宽度)、优先队列搜索,方便对比。
```python
from collections import deque
import heapq
graph = {
'A': 'B', 'C',
'B': 'D', 'E',
'C': 'F',
'D': \[\],
'E': 'G',
'F': \[\],
'G': \[\]
}
1. 深度优先 DFS:用递归/栈,一条路走到黑
def dfs(node, visited=None):
if visited is None:
visited = set()
visited.add(node)
print(node, end=' ')
for nxt in graphnode:
if nxt not in visited:
dfs(nxt, visited)
print("DFS 深度优先:")
dfs('A')
print("\n")
输出:A B D E G C F
2. 广度优先 / 宽度优先 BFS:用队列,一层一层访问
def bfs(start):
q = deque(start)
visited = {start}
while q:
node = q.popleft()
print(node, end=' ')
for nxt in graphnode:
if nxt not in visited:
visited.add(nxt)
q.append(nxt)
print("BFS 广度优先 = 宽度优先:")
bfs('A')
print("\n")
输出:A B C D E F G
3. 优先队列搜索:不是按层,也不是一路到底,而是按"优先级"扩展
这里示例:字母越大越优先,用 -ord(x) 当优先级
def best_first(start, priority):
pq = (priority(start), start)
visited = set()
while pq:
_, node = heapq.heappop(pq)
if node in visited:
continue
visited.add(node)
print(node, end=' ')
for nxt in graphnode:
if nxt not in visited:
heapq.heappush(pq, (priority(nxt), nxt))
print("优先队列搜索:")
best_first('A', lambda x: -ord(x))
print()
输出:A C F B E G D
```
对比总结:
算法 数据结构 特点 示例输出
DFS 深度优先 栈 / 递归 一条路走到底,不按层 A B D E G C F
BFS 广度/宽度优先 队列 一层一层访问,无权图可求最短路径 A B C D E F G
优先队列搜索 堆 每次选优先级最高/代价最小的节点 取决于优先级
关键区别:
· 深度优先 DFS:先深入,走不动再回头。
· 广度优先 BFS:也叫宽度优先,先访问离起点近的所有节点,再访问下一层。
· 优先队列搜索:不关心层数,只关心"谁优先级更高",常用于 Dijkstra、A*、最佳优先搜索等。
文章仅供参考用。