【JavaScript 算法】广度优先搜索:层层推进的搜索策略

news2024/9/23 3:19:08

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、算法原理
    • 二、算法实现
    • 三、应用场景
    • 四、优化与扩展
    • 五、总结

在这里插入图片描述

广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索图或树数据结构的算法。该算法从起始节点开始,逐层向外扩展,直到找到目标节点或遍历完所有节点。本文将详细介绍广度优先搜索算法的原理、实现及其应用。


一、算法原理

广度优先搜索的基本思想是从起始节点开始,先访问所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,层层推进。其基本步骤如下:

  1. 从起始节点开始,将其标记为已访问,并加入队列。
  2. 当队列不为空时,取出队列的头节点,访问该节点的所有相邻节点。
  3. 对于每个相邻节点,如果未被访问过,将其标记为已访问并加入队列。
  4. 重复步骤2和3,直到队列为空或找到目标节点。

在这里插入图片描述


二、算法实现

以下是广度优先搜索的JavaScript实现:

/**
 * 广度优先搜索算法
 * @param {Object} graph - 图的邻接表表示
 * @param {string} start - 起始节点
 */
function breadthFirstSearch(graph, start) {
  const queue = [start]; // 初始化队列,将起始节点加入队列
  const visited = new Set(); // 用于记录已访问的节点

  visited.add(start); // 将起始节点标记为已访问

  while (queue.length > 0) {
    const node = queue.shift(); // 取出队列的头节点
    console.log(node); // 访问节点

    // 访问当前节点的所有相邻节点
    for (const neighbor of graph[node]) {
      // 如果相邻节点未被访问过,将其标记为已访问并加入队列
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        queue.push(neighbor);
      }
    }
  }
}

// 示例图的邻接表表示
const graph = {
  A: ['B', 'C'],
  B: ['D', 'E'],
  C: ['F'],
  D: [],
  E: ['F'],
  F: []
};

// 调用广度优先搜索算法
breadthFirstSearch(graph, 'A'); // 输出: A B C D E F
  1. 函数定义与参数

    • breadthFirstSearch(graph, start):广度优先搜索算法,接受图的邻接表表示和起始节点作为参数。
  2. 初始化队列和已访问节点集合

    • const queue = [start];:初始化队列,将起始节点加入队列。
    • const visited = new Set();:初始化已访问节点集合,用于记录已访问的节点。
  3. 标记起始节点为已访问

    • visited.add(start);:将起始节点标记为已访问。
  4. 遍历队列中的节点

    • while (queue.length > 0):当队列不为空时,继续遍历。
    • const node = queue.shift();:取出队列的头节点。
  5. 访问节点并访问其相邻节点

    • console.log(node);:访问节点,打印节点值。
    • for (const neighbor of graph[node]):遍历当前节点的相邻节点。
    • if (!visited.has(neighbor)):如果相邻节点未被访问过。
    • visited.add(neighbor);:将相邻节点标记为已访问。
    • queue.push(neighbor);:将相邻节点加入队列,等待后续遍历。
  6. 示例图和调用

    • 定义一个示例图的邻接表表示。
    • 调用breadthFirstSearch函数,进行广度优先搜索,并输出结果。

三、应用场景

  1. 最短路径搜索
    广度优先搜索可以用于在无权图中寻找两个节点之间的最短路径。由于BFS逐层遍历,第一次找到目标节点时,即可保证路径是最短的。

  2. 连通性检查
    BFS可以用于检查图的连通性,确定图中是否存在路径连接所有节点,并找出所有连通分量。

  3. 层次遍历
    BFS在树的层次遍历中有重要应用,可以按层次顺序访问树的节点。

  4. 求解迷宫问题
    在迷宫问题中,BFS可以用于寻找从起点到终点的最短路径,通过逐层扩展,可以找到最短路径解。


四、优化与扩展

  1. 记录路径
    在实际应用中,除了访问节点外,还需要记录从起始节点到每个节点的路径,可以通过在队列中存储路径信息来实现。
/**
 * 广度优先搜索算法(记录路径)
 * @param {Object} graph - 图的邻接表表示
 * @param {string} start - 起始节点
 * @return {Object} - 每个节点的路径
 */
function breadthFirstSearchWithPath(graph, start) {
  const queue = [[start]]; // 初始化队列,队列中存储路径
  const visited = new Set(); // 用于记录已访问的节点

  visited.add(start); // 将起始节点标记为已访问

  while (queue.length > 0) {
    const path = queue.shift(); // 取出队列的头路径
    const node = path[path.length - 1]; // 获取路径中的最后一个节点

    console.log(node); // 访问节点

    // 访问当前节点的所有相邻节点
    for (const neighbor of graph[node]) {
      // 如果相邻节点未被访问过,将其标记为已访问并加入队列
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        const newPath = [...path, neighbor]; // 创建新的路径
        queue.push(newPath); // 将新路径加入队列
      }
    }
  }
}

// 调用广度优先搜索算法(记录路径)
breadthFirstSearchWithPath(graph, 'A');
  1. 双向广度优先搜索
    对于某些特殊场景,可以使用双向广度优先搜索,同时从起点和终点开始进行BFS,直到两边相遇,从而减少搜索空间,提高效率。

五、总结

广度优先搜索(BFS)是一种用于遍历或搜索图或树数据结构的有效算法。它通过逐层推进的方式,从起始节点开始,先访问所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,直到找到目标节点或遍历完所有节点。广度优先搜索算法实现简单,适用于最短路径搜索、连通性检查、层次遍历和求解迷宫问题等应用场景。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

delete删除new[]创建的数组会发生什么

这是国泰君安技术面出的题 先说结论 如果是删除原始的数据类型,并不会发生什么,也不会产生内存泄露。如果是删除自定义类型,比如说类和结构体,则只能删除第一个,后面的可能会内存泄露。 一、删除原始数据类型 举个…

LeetCode 141.环形链表 C写法

LeetCode 141.环形链表 C写法 思路🧐: ​ 利用快慢指针,快指针走两步,慢指针走一步,如果没有环,快指针走完就返回false,如果有环,那么快指针一定先进环,等慢指针进环以后…

闯荡西游之路,续写经典传奇,大话西游图文架设教程

前言 这次给大家带来的是我精心准备了很久的,也是大家呼声很高的大话西游,云集西游版本,安卓苹果双端,非变态版本,包含天梯、星阵、八卦等玩法,游戏内置GM后台,快来体验一下吧~ 本文讲解大话西…

公司网站搭建源码系统 带网站的源代码包以及搭建部署教程

系统概述 随着互联网的飞速发展,网站已成为企业对外展示、交流和服务的重要窗口。然而,对于非技术背景的企业而言,自行开发网站往往面临技术门槛高、成本高、周期长等难题。因此,我们推出了这款集成了先进技术和丰富功能的网站搭…

一文详解DDL同步及其应用场景

目录 一、什么是DDL? 二、什么是DDL同步? 三、DDL同步的痛点 1、缺少自动DDL同步机制 2、缺少DDL变更监测预警 四、解决方案 五、应用场景及案例 案例一 案例二 案例三 在现代数据管理中,数据库的结构变更频繁且不可避免,特别是在…

风光摄影:相机设置和镜头选择

写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置,镜头选择的建议对小白来讲很实用,避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 😃,生活加油 99%的焦虑都来自于虚度时间和没有好…

秋招在线测评,性格和岗位是如何匹配的?

又是一年的秋招季,应届毕业生都会面临一个问题,如何将性格和岗位相互匹配,以找到最合适的自己的岗位呢? 事实上绝大部分人并没有找准最适合的岗位..... 对于应届毕业生来说,通常都是想着先拿下offer,至于是…

frameworks 之Zygote

frameworks 之Zygote Zygote.rc 解析Zygote 启动ZygoteInit.javaZygote.cppLiunx fork Zygote 中文意思为受精卵。 和其意思一样,该功能负责android系统孵化service 和 app 进程。 本文讲解Zygote的大概流程。涉及的相同的类,如下所示 system/core/rootd…

centos9+mysql8.0下mycat1.6部署

#创作灵感# 整理一下mysql代理技术,这个当时是和mysql集群部署一个项目的,一并整理出来供参考。 1、环境准备 此处使用的为M-M-SS双主双从结构集群,集群部署方法放在我的上一篇文章中 防火墙可以使用firewall-cmd放行,演示环境…

Nature Communications|柔性高密度、高灵敏应变传感器阵列(柔性应变传感/界面调控/电子皮肤/柔性电子)

复旦大学武利民( Limin Wu)和李卓( Zhuo Li)团队,在《Nature Communications》上发布了一篇题为“High-density, highly sensitive sensor array of spiky carbon nanospheres for strain field mapping”的论文。论文内容如下: 一、 摘要 在工程应用中,准确地映射应变…

SQL 删除emp_no重复的记录,只保留最小的id对应的记录。

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 删除emp_no重…

CDGA|数据治理:标准化处理与确保数据可溯源性

在当今信息爆炸的时代,数据已成为企业决策、科学研究和政府管理的核心要素。然而,随着数据量的不断增加和来源的多样化,数据治理成为了一个亟待解决的问题。特别是在处理复杂数据时,标准化处理和确保数据的可溯源性显得尤为重要。…

etcd 实现分布式锁

10 基于 Etcd 的分布式锁实现原理及方案

Python算法分析学习目标及能力验证

1、突破编程的关键点 不破不立,如何破?如何立? 人生苦短,我用python 目标:不在于多,而在于准; 验证:必须量化,否则都是虚夸。 那么目标怎么准确可量化呢? …

容联云发布容犀大模型应用,重塑企业“营销服”|WAIC 2024

7月6日,在2024世界人工智能大会上,容联云成功举办主题为“数智聚合 产业向上”的生成式应用与大模型商业化实践论坛。 论坛上,容联云发布了容犀智能大模型应用升级,该系列应用包括容犀Agent Copilot、容犀Knowledge Copilot、容犀…

动态规划的一种常见技巧

动态规划是运筹学的一个分支,是求解决策过程最优化的过程。 动态规划并不是一种算法,而是一种思想,或者说策略 动态规划的思想就是将大问题分解成一个一个的小问题,聚焦到每个小问题并逐个击破,小问题解决了就没有大问…

数据融合工具(7)文本属性值规范化处理

一、需求背景 数据检查方案中,对文本属性值的检查一般包括以下内容: 检查属性值中不能含有不合理的标点符号(“,”、“?”、空格、换行符等); 确认全部属性字段是否为半角; 名称简…

FastAPI 学习之路(四十二)利用Docker部署发布

我们之前的部署都是基于本地的部署,我们这次来看下,如何使用docker部署我们的fastapi项目。 编写Dockerfile ①:首先编写一个docker镜像的制作文件Dockerfile FROM python:3.10RUN pip install fastapi uvicorn aiofiles sqlalchemy pytho…

led灯什么牌子的质量好呢?盘点五款高口碑的led灯

很多新手小白在选购护眼台灯前,都会思考led灯什么牌子的质量好呢?这因为有的无良商家因为想要降低成本,使用一些廉价低劣的处理器,led灯的电压和功率都难以保证,有的甚至会产生有害的辐射,对人体的健康造成…

基于web、dns、nfs的综合实验

题目: 现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…