LeetCode算法笔记

前言

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(),将队列改成了双端队列,支持在两端中的任意一端增加和删除数据。在基于深度优先搜素和队列的学习,认识到基于队列实现广度优先搜素与基于堆栈实现深度优先搜素类似,都运用了队列或堆栈的特性。在学习这个算法之后,我觉得最重要也是最难的难点是在访问到未坊问过的节点的存储(利用队列存储数据),要在上一个节点访问完之后正确找到下一个要访问的节点。


总结

我对广度优先搜索的理解:认为 广度优先搜索是在将这一层的数据访问完之后,再访问根据上一层对应的数据依次访问。广度优先搜索与深度优先搜索不同,利用循环其先在访问完当前节点所指向的所有节点,将其未访问过的节点存储在队列中,再访问当前节点指向的第一个节点指向的所有节点,将其未访问过的节点存储在队列中,重复之前的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霜枫91

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值