ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

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

Python区分广度优先深度优先宽度优先的区别 先说明广度优先搜索BFS就是宽度优先搜索二者通常没有区别真正相对的是 深度优先搜索DFS。所以严格说只有 DFS 和 BFS 两类。下面写三段代码DFS、BFS广度/宽度、优先队列搜索方便对比。pythonfrom collections import dequeimport heapqgraph {A: [B, C],B: [D, E],C: [F],D: [],E: [G],F: [],G: []}# 1. 深度优先 DFS用递归/栈一条路走到黑def dfs(node, visitedNone):if visited is None:visited set()visited.add(node)print(node, end )for nxt in graph[node]: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 graph[node]: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:continuevisited.add(node)print(node, end )for nxt in graph[node]: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 FBFS 广度/宽度优先 队列 一层一层访问无权图可求最短路径 A B C D E F G优先队列搜索 堆 每次选优先级最高/代价最小的节点 取决于优先级关键区别· 深度优先 DFS先深入走不动再回头。· 广度优先 BFS也叫宽度优先先访问离起点近的所有节点再访问下一层。· 优先队列搜索不关心层数只关心“谁优先级更高”常用于 Dijkstra、A*、最佳优先搜索等。文章仅供参考用。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表