当前位置: 首页 > news >正文

广度优先搜索 (BFS)

目录

前言

核心思想

容器:队列

code

常见的坑点


前言

最近在刷 LeetCode ,连带着把基础算法梳理了一遍。
以前写业务代码总觉得算法离自己很远,但真到了做 3D 深层的时候,发现根本绕不开。在用 Three.js 处理复杂的 场景图 遍历,或者写 WebGL 相关的八叉树空间算法时,底层的树和图遍历逻辑直接决定了渲染性能。

核心思想

BFS 的核心逻辑:层层推进。

可想象为:往池塘里扔了一块石头,水波是一圈一圈往外扩散的。BFS 也是这样,从起点开始,先把距离为 1 的周围节点全摸一遍,然后再去摸距离为 2 的
这种特性决定了 BFS 适合用来解决两类问题:

  1. 层序遍历(比如把树的节点一层层打印出来)
  2. 无权图的最短路径(比如迷宫寻路、社交网络找几度人脉)

容器:队列

在js里实现 BFS,最核心的数据结构就是队列

口诀:先进先出。在 JS 数组里,也就是靠 push() 进队,靠 shift() 出队。

code

function bfs(root) { if (!root) return; // 1. 初始化队列,把起点塞进去 const queue = [root]; // (可选) 如果是图结构,需要记录访问过的节点防死循环 // const visited = new Set(); // visited.add(root); let step = 0; // 记录扩散的层数/步数 // 2. 只要队列不为空,就一直榨干它 while (queue.length > 0) { // 关键点:要先缓存当前层的节点数量 // 因为在遍历这一层的时候,还会往队列里塞下一层的节点 const size = queue.length; // 3. 一次性把当前层的所有节点全部处理完 for (let i = 0; i < size; i++) { // 拿出队头节点 const current = queue.shift(); // ---> 在这里做具体的业务逻辑处理 <--- // console.log(current.val); // 4. 把当前节点的相邻节点(下一层)塞进队列 if (current.left) queue.push(current.left); if (current.right) queue.push(current.right); // 如果是图结构,找邻居大概长这样: // for (const neighbor of current.neighbors) { // if (!visited.has(neighbor)) { // queue.push(neighbor); // visited.add(neighbor); // } // } } // 当前层处理完毕,步数 +1 step++; } } ```


常见的坑点

  1. 忘了按层处理:直接 queue.shift() 然后就去判断邻居了,没加那个 for 循环。如果只是想遍历所有节点,那没问题。但如果要求最短路径长度或者按层输出,那个 for (let i = 0; i < size; i++) 是不能省的,它保证了每一轮 while 循环处理的都是同一圈的人。
  2. 图遍历忘了去重:如果是树(比如 DOM 树结构),它是单向的,不需要去重。但如果是图(节点之间互相指),必须要用 Set 记录 visited。节点在加入队列时就要标记为已访问,而不是出队时才标记,否则同一个节点可能会被上一层的多个节点重复塞进队列,内存瞬间爆炸。
http://www.jsqmd.com/news/927270/

相关文章:

  • 第 5 周——诗词创作模块后端接口对接
  • 2026年比较好的梁山水处理乳品设备/梁山乳品设备/离心机乳品设备/均质机乳品设备精选推荐公司 - 行业平台推荐
  • AI时代密码安全新策略:从随机密码到密码管理器的全面防御
  • 2026年质量好的共挤膜气泡膜卷/彩色气泡膜卷可靠供应商推荐 - 行业平台推荐
  • 在WSL2的Ubuntu 22.04上,用Intel OneAPI 2024编译VASP 6.3.2的保姆级教程
  • 别再只用Aircrack了!横向评测Kismet与airodump-ng:无线网络扫描工具到底怎么选?
  • 2026年知名的水表箱/SMC水表箱/防冻水表箱优质厂家汇总推荐 - 行业平台推荐
  • 用STM32F103和继电器DIY智能家居:低成本改造台灯与风扇的保姆级教程
  • 从开源哲学到AI伦理:模块化、透明性与协作如何重塑技术未来
  • 2026年义乌本地快递气泡袋/气泡袋/气泡袋定制长期合作厂家推荐 - 行业平台推荐
  • Go 并发模式深度解析:Fan-out/Fan-in 高效处理大规模数据流
  • GD32F470驱动WS2812B灯带:用SPI+DMA实现“零”CPU占用的呼吸灯效果(附完整代码)
  • 无人机避障规划实战:如何用ESDF地图让Fast-Planner飞得更安全?
  • 2026年比较好的三角梅苗木基地/三角梅养殖基地/三角梅种植基地诚信商家榜 - 品牌宣传支持者
  • 2026年评价高的高温衬氟磁力泵/磁力泵品牌厂家推荐 - 品牌宣传支持者
  • mbedtls AES加密的PKCS#7填充详解:为什么你的解密结果总差几个字节?
  • 构建个人增强系统:从可穿戴设备到生物反馈的实践指南
  • [开源] DRG边界病例错分识别与病案首页整改建议系统:面向医院信息科、医保办与病案室的自动化质控工具
  • CRAFT框架:大模型驱动的多机器人协同训练技术解析
  • 2026年江浙沪气泡膜卷/共挤膜气泡膜卷/彩色气泡膜卷/黑色气泡膜卷可靠供应商推荐 - 行业平台推荐
  • 2026年热门的苏州AI算力机房/弱电算力机房热选公司推荐 - 品牌宣传支持者
  • 保姆级教程:用YOLOv8n和BotSORT搞定足球比赛视频的球员与足球追踪(附完整Python源码)
  • 爆火的三个GitHub项目,真香~
  • 2026年知名的浙江机房建设方案/机房建设施工方案榜单优选公司 - 行业平台推荐
  • AI编码时代:如何审查与理解AI生成代码,夺回代码所有权
  • 驾驭AI:从理解大语言模型到构建人机协作工作流
  • 【Gemini安全红皮书首发】:基于MITRE ATTCK框架的5类攻击面测绘+自动化检测脚本(限前500名开发者领取)
  • 别再只用散点图了!用Seaborn的pairplot函数5分钟搞定多变量关系探索(附国赛数据集实战)
  • 告别蓝图依赖:用C++重构你的UE项目核心框架(GameMode篇)
  • 2026年口碑好的挂布台车/多功能台车/浙江隧道台车高口碑品牌推荐 - 品牌宣传支持者