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

算法——BFS

BFS(广度优先搜索)
是一种用于遍历或搜索树/图的算法,逐层访问节点,适合解决最短路径、层级遍历等问题。

一、BFS 的核心思想
队列结构:用队列(先进先出)保存待处理的节点。
逐层扩散:从起点开始,先处理当前层的所有节点,再处理下一层。
避免重复:用 visited 集合(或标记)记录已访问的节点,防止死循环。

二、代码框架

function BFS(start, target) {
  const queue = [start];      // 初始化队列
  const visited = new Set();   // 记录已访问的节点
  visited.add(start);

  let step = 0;               // 记录扩散的步数(可选)

  while (queue.length > 0) {
    // 处理当前层的所有节点
    const levelSize = queue.length;
    for (let i = 0; i < levelSize; i++) {
      const current = queue.shift();  // 从队头取出节点

      // 判断是否到达终点
      if (current === target) return step;

      // 将相邻未访问的节点加入队列
      for (const neighbor of getNeighbors(current)) {
        if (!visited.has(neighbor)) {
          queue.push(neighbor);
          visited.add(neighbor);
        }
      }
    }
    step++;  // 步数增加(视题目需求决定)
  }
  return -1; // 未找到路径
}

三、经典问题示例

1、二叉树层序遍历

function levelOrder(root) {
  if (!root) return [];
  const queue = [root];
  const result = [];

  while (queue.length > 0) {
    const levelSize = queue.length;
    const currentLevel = [];
    for (let i = 0; i < levelSize; i++) {
      const node = queue.shift();
      currentLevel.push(node.val);
      if (node.left) queue.push(node.left);
      if (node.right) queue.push(node.right);
    }
    result.push(currentLevel);
  }
  return result;
}

2、 迷宫最短路径
假设有一个二维网格,求从起点 (0,0) 到终点 (m-1, n-1) 的最短步数(1 表示障碍):

function shortestPath(grid) {
  const rows = grid.length, cols = grid[0].length;
  const queue = [[0, 0]];  // 起点
  const visited = new Set().add('0,0');
  let step = 0;

  const directions = [[1,0], [-1,0], [0,1], [0,-1]]; // 上下左右

  while (queue.length > 0) {
    const levelSize = queue.length;
    for (let i = 0; i < levelSize; i++) {
      const [x, y] = queue.shift();
      if (x === rows-1 && y === cols-1) return step; // 到达终点

      for (const [dx, dy] of directions) {
        const nx = x + dx, ny = y + dy;
        if (nx >=0 && nx < rows && ny >=0 && ny < cols && grid[nx][ny] === 0) {
          const key = `${nx},${ny}`;
          if (!visited.has(key)) {
            queue.push([nx, ny]);
            visited.add(key);
          }
        }
      }
    }
    step++;
  }
  return -1; // 无法到达
}

四、BFS 的适用场景

1、最短路径问题(无权图最短步数)
2、层级遍历(如二叉树层序遍历)
3、扩散类问题(如病毒传播模拟、社交网络层级关系)

五、注意事项

1、队列操作:JavaScript 中直接用数组的 shift() 效率较低,可优化为维护一个指针(类似双端队列)。
2、去重方式:根据问题场景,可以用 Set、哈希表或直接修改原数据(如标记为已访问)。
3、终止条件:根据问题提前判断是否到达目标。

相关文章:

  • SQL Server 2014 利用SubString获取Json格式指定字段数据
  • 微信小程序无缝衔接弹幕效果纯CSS
  • JAVA Web_定义Servlet2_学生登录验证Servlet
  • 005_多表查询
  • 在Vue 中如何使用动态样式
  • asp.net Kestrel 和iis区别
  • 基于OpenCV与PyTorch的智能相册分类器全栈实现教程
  • 耘想WinNAS:以聊天交互重构NAS生态,开启AI时代的存储革命
  • 【后端开发】Spring配置文件
  • ubuntu22.04-VMware Workstation移动后无法连接网络
  • 【视频目标分割论文集】Efficient Track Anything0000
  • 【深度学习与大模型基础】第11章-Bernoulli分布,Multinoulli分布
  • LeetCode 热题 100_单词拆分(86_139_中等_C++)(动态规划)
  • 【从C到C++的算法竞赛迁移指南】第五篇:现代语法糖精粹 —— 写出优雅的竞赛代码
  • 豪越消防一体化安全管控平台:构建消防“一张图”新生态
  • Java Web 300问
  • 大数据(7.4)Kafka存算分离架构深度实践:解锁对象存储的无限潜能
  • STM32基础教程——AD单通道
  • 一款安全好用的企业即时通讯平台,支持统一门户
  • 单链表各种操作实现(数据结构C语言多文件编写)
  • 爱德华多·阿拉纳宣誓就任秘鲁新总理
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略
  • “中国神湖”加快放大资源规模!3亿美元换海外年产380万吨钾盐项目
  • 重庆市委原常委、政法委原书记陆克华被决定逮捕
  • 中华人民共和国和巴西联邦共和国关于强化携手构建更公正世界和更可持续星球的中巴命运共同体,共同维护多边主义的联合声明
  • 牛市早报|中美日内瓦经贸会谈联合声明公布