Python区分广度优先深度优先宽度优先的区别

先说明:广度优先搜索(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*、最佳优先搜索等。

文章仅供参考用。

相关推荐
2601_967979129 小时前
纯手写:Python安装pip完整教程,搞了几小时,终于成功
python·教程·pip·安装·包管理
Norna10 小时前
缓存文件从没写出来:一个 .json 被当成目录用了
python
aifannihao12 小时前
AI 学习第 14 课:CNN 训 6 轮卡在 0.5352,数据没打乱
pytorch·python·深度学习·cnn·学习路线
yuyuxun113 小时前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
如夏倾城13 小时前
百度文心(容易被忽略的好用AI)使用方式
人工智能·python·百度·语言模型·dubbo
用户0190275816113 小时前
quotes 实时价和 klines 最新收盘价为什么对不上?
python
Code_Solitude13 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司14 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
少司府14 小时前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件