前言
Datawhale十月组队学习,LeetCode算法
广度优先搜索
广度优先搜索算法(Breadth First Search):英文缩写为 BFS,又译作宽度优先搜索 / 横向优先搜索,是一种用于搜索树或图结构的算法。广度优先搜索算法从起始节点开始,逐层扩展,先访问离起始节点最近的节点,后访问离起始节点稍远的节点。以此类推,直到完成整个搜索过程。
因为遍历到的节点顺序符合「先进先出」的特点,所以广度优先搜索可以通过「队列」来实现。
认为 广度优先搜索是在将这一层的数据访问完之后,再访问根据上一层对应的数据依次访问。
基于队列实现的广度优先搜索
代码如下
import collections
class Solution:
def bfs(self, graph, u):
visited = set() # 使用 visited 标记访问过的节点
queue = collections.deque([]) # 使用 queue 存放临时节点
visited.add(u) # 将起始节点 u 标记为已访问
queue.append(u) # 将起始节点 u 加入队列中
while queue: # 队列不为空
u = queue.popleft() # 取出队头节点 u
print(u) # 访问节点 u
for v in graph[u]: # 遍历节点 u 的所有未访问邻接节点 v
if v not in visited: # 节点 v 未被访问
visited.add(v) # 将节点 v 标记为已访问
queue.append(v) # 将节点 v 加入队列中
graph = {
"0": ["1", "2"],
"1": ["0", "2", "3"],
"2": ["0", "1", "3", "4"],
"3": ["1", "2", "4", "5"],
"4": ["2", "3"],
"5": ["3", "6"],
"6": []
}
# 基于队列实现的广度优先搜索
Solution().bfs(graph, "0")
理解: 在代码中引用了collections.deque(),将队列改成了双端队列,支持在两端中的任意一端增加和删除数据。在基于深度优先搜素和队列的学习,认识到基于队列实现广度优先搜素与基于堆栈实现深度优先搜素类似,都运用了队列或堆栈的特性。在学习这个算法之后,我觉得最重要也是最难的难点是在访问到未坊问过的节点的存储(利用队列存储数据),要在上一个节点访问完之后正确找到下一个要访问的节点。
总结
我对广度优先搜索的理解:认为 广度优先搜索是在将这一层的数据访问完之后,再访问根据上一层对应的数据依次访问。广度优先搜索与深度优先搜索不同,利用循环其先在访问完当前节点所指向的所有节点,将其未访问过的节点存储在队列中,再访问当前节点指向的第一个节点指向的所有节点,将其未访问过的节点存储在队列中,重复之前的操作。