【JavaScript 算法】深度优先搜索:探索所有可能的路径

news2024/11/16 6:31:15

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

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

在这里插入图片描述

深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索图或树数据结构的算法。该算法尽可能深入图的分支,探索所有可能的路径,直到找到目标节点或遍历完所有节点。本文将详细介绍深度优先搜索算法的原理、实现及其应用。


一、算法原理

深度优先搜索的基本思想是从起始节点开始,沿着一个分支尽可能深入,然后回溯并继续探索其他分支,直到遍历完所有节点或找到目标节点。其基本步骤如下:

  1. 从起始节点开始,将其标记为已访问。
  2. 对于当前节点的每个相邻节点:
    • 如果相邻节点未被访问,递归地执行深度优先搜索。
  3. 回溯到上一个节点,继续探索其他未被访问的相邻节点。

在这里插入图片描述


二、算法实现

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

/**
 * 深度优先搜索算法
 * @param {Object} graph - 图的邻接表表示
 * @param {string} start - 起始节点
 * @param {Set} visited - 已访问节点集合
 */
function depthFirstSearch(graph, start, visited = new Set()) {
  console.log(start); // 访问节点
  visited.add(start); // 将节点标记为已访问

  for (const neighbor of graph[start]) {
    if (!visited.has(neighbor)) {
      depthFirstSearch(graph, neighbor, visited); // 递归访问相邻节点
    }
  }
}

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

depthFirstSearch(graph, 'A'); // 输出: A B D E F C

三、应用场景

  1. 路径搜索:在图或树中寻找从起始节点到目标节点的路径。
  2. 连通性检查:检查图中节点的连通性,确定图是否连通。
  3. 拓扑排序:在有向无环图(DAG)中进行拓扑排序。
  4. 解决迷宫问题:寻找从起点到终点的路径。

四、优化与扩展

  1. 迭代实现:除了递归实现外,深度优先搜索也可以用迭代方式实现。
/**
 * 迭代实现深度优先搜索算法
 * 使用栈来模拟递归调用,实现对图的深度优先遍历
 * @param {Object} graph - 图的邻接表表示
 * @param {string} start - 起始节点
 */
function depthFirstSearchIterative(graph, start) {
  const stack = [start]; // 初始化栈,将起始节点压入栈中
  const visited = new Set(); // 用于记录已访问的节点

  // 当栈不为空时,继续遍历
  while (stack.length > 0) {
    const node = stack.pop(); // 弹出栈顶节点

    // 如果节点未被访问
    if (!visited.has(node)) {
      console.log(node); // 访问节点
      visited.add(node); // 将节点标记为已访问

      // 将相邻节点压入栈中
      for (const neighbor of graph[node]) {
        stack.push(neighbor); // 相邻节点压入栈
      }
    }
  }
}

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

// 调用迭代实现的深度优先搜索算法
depthFirstSearchIterative(graph, 'A'); // 输出: A C F B E D
  1. 检测环路:在进行深度优先搜索时,可以检测图中是否存在环路。
/**
 * 检测图中是否存在环路
 * 使用深度优先搜索检测有向图中的环路
 * @param {Object} graph - 图的邻接表表示
 * @param {string} node - 当前节点
 * @param {Set} visited - 已访问节点集合,默认初始化为空集合
 * @param {Set} stack - 当前路径节点集合,默认初始化为空集合
 * @return {boolean} - 是否存在环路
 */
function hasCycle(graph, node, visited = new Set(), stack = new Set()) {
  // 如果节点在当前路径中,说明存在环路
  if (stack.has(node)) return true;
  
  // 如果节点已访问且不在当前路径中,说明不存在环路
  if (visited.has(node)) return false;

  // 将节点标记为已访问
  visited.add(node);
  // 将节点添加到当前路径中
  stack.add(node);

  // 递归检查所有相邻节点
  for (const neighbor of graph[node]) {
    if (hasCycle(graph, neighbor, visited, stack)) return true;
  }

  // 从当前路径中删除节点
  stack.delete(node);
  return false;
}

// 示例图(包含环路)
const graphWithCycle = {
  A: ['B'],
  B: ['C'],
  C: ['A']
};

// 调用函数检测环路
console.log(hasCycle(graphWithCycle, 'A')); // 输出: true

// 示例图(不包含环路)
const graphWithoutCycle = {
  A: ['B'],
  B: ['C'],
  C: []
};

// 调用函数检测环路
console.log(hasCycle(graphWithoutCycle, 'A')); // 输出: false

五、总结

深度优先搜索是一种用于遍历或搜索图或树数据结构的有效算法。通过理解和掌握深度优先搜索算法,可以解决许多实际问题,如路径搜索、连通性检查、拓扑排序和迷宫问题等。希望本文对你理解和应用深度优先搜索有所帮助。


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

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

相关文章

【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计

站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程,每日更新干货内容 想要深入学习更多AI绘图教程,请访问站长素材AI教程网: AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有!本笔记仅供AIGC…

防火墙的NAT策略以及智能选路

一、实验拓扑 二、实验要求 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8,分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9,多出口环境基于带宽比例进…

【机器学习】逻辑回归的原理、应用与扩展

文章目录 一、逻辑回归概述二、Sigmoid函数与损失函数2.1 Sigmoid函数2.2 损失函数 三、多分类逻辑回归与优化方法3.1 多分类逻辑回归3.2 优化方法 四、特征离散化 一、逻辑回归概述 逻辑回归是一种常用于分类问题的算法。大家熟悉的线性回归一般形式为 Y a X b \mathbf{Y}…

2024辽宁省大学生数学建模竞赛(C题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024电工杯数学建模竞赛(B题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解…

Redis vs Memcache:哪个更适合你的应用?

Redis vs Memcache:哪个更适合你的应用? 1、存储与持久化2、数据类型支持3、性能与底层机制4、Value值大小限制5、数据备份与容灾6、总结 💖The Begin💖点点关注,收藏不迷路💖 在缓存技术的选择中&#xff…

CV08_深度学习模块之间的缝合教学(3)--加载预训练权重

1.1 引言 我们在修改网络模型,添加或删除模块,或者更改了某一层之后,直接加载原先的预训练权重,肯定是会报错的,因为原来的模型权重和修改后的模型权重之间的结构是不匹配的。 那么我们只想加载那些没有更改过的那个…

Python酷库之旅-第三方库Pandas(020)

目录 一、用法精讲 49、pandas.merge_asof函数 49-1、语法 49-2、参数 49-3、功能 49-4、返回值 49-5、说明 49-5-1、功能 49-6、用法 49-6-1、数据准备 49-6-2、代码示例 49-6-3、结果输出 50、pandas.concat函数 50-1、语法 50-2、参数 50-3、功能 50-4、返…

中仕公考:没有教师资格证能考编吗?

没有教师资格证的考生,是不能参加教师编考试的。但是,符合“先上岗,再考证”的阶段性措施,高校毕业生可在未获得教师资格证的情况下先行就业。其他考生必须首先取得教师资格证,才能参与教师编考试。 报考普通小学和幼…

【Android Studio】实现底部导航栏Tab切换(提供Gitee源码)

前言:本期教学如何制作底部导航栏以及使用Fragment实现页面切换的完整功能,本篇提供所有源代码,均测试无误,大家可以放心使用。 目录 一、功能演示 二、代码实现 2.1、bottom.xml 2.2、message.xml、book.xml和mine.xml 2.3、…

第三期书生大模型实战营之Git前置知识

闯关任务1 每位参与者提交一份自我介绍。 提交地址&#xff1a;https://github.com/InternLM/Tutorial 的 camp3 分支&#xff5e; 要求 1. 命名格式为 camp3_<id>.md&#xff0c;其中 <id> 是您的报名问卷ID。 2. 文件路径应为 ./data/Git/task/。 3. 在 GitHub…

单网口设备的IP地址识别-还原-自组网

1.如果知道该设备所在网段&#xff1a; 此时可以使用nmap工具&#xff0c;进行网段扫描&#xff1a; nmap -sn 192.168.0.0/24 256个地址的子网10秒就能扫描一轮。关掉设备&#xff0c;打开设备&#xff0c;diff&#xff0c;基本就可以定位所要找到目标设备的IP 2.如果不知道…

链接追踪系列-04.linux服务器docker安装elk

[rootVM-24-17-centos ~]# cat /proc/sys/vm/max_map_count 65530 [rootVM-24-17-centos ~]# sysctl -w vm.max_map_count262144 vm.max_map_count 262144 #先创建出相应目录&#xff1a;/opt/dockerV/es/…docker run -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -d -p 92…

隔离驱动-视频课笔记

目录 1、需要隔离的原因 1.2、四种常用的隔离方案 2、脉冲变压器隔离 2.1、脉冲变压器的工作原理 2.2、泄放电阻对开关电路的影响 2.3、本课小结 3、光耦隔离驱动 3.1、光耦隔离驱动原理 3.2、光耦隔离驱动的电源进行分析 3.3、本课小结 4、自举升压驱动 4.1…

哪款开放式运动耳机佩戴最舒服?2024五款备受推崇产品分享!

​热爱户外活动的你&#xff0c;定是对生活有着独到品味的行者。想象一下&#xff0c;在户外活动时&#xff0c;若有一款耳机能完美融入场景&#xff0c;为你带来无与伦比的音乐享受&#xff0c;岂不是锦上添花&#xff1f;此时&#xff0c;开放式耳机便应运而生&#xff0c;其…

SEO:6个避免被搜索引擎惩罚的策略-华媒舍

在当今数字时代&#xff0c;搜索引擎成为了绝大多数人获取信息和产品的首选工具。为了在搜索结果中获得良好的排名&#xff0c;许多网站采用了各种优化策略。有些策略可能会适得其反&#xff0c;引发搜索引擎的惩罚。以下是彭博社发稿推广的6个避免被搜索引擎惩罚的策略。 1. 内…

结合实体类型信息(3)——TransT: 基于类型的多重嵌入表示用于知识图谱补全

1 引言 1.1 问题 仅仅依赖于三元组的结构化信息有其局限性&#xff0c;因为它们往往忽略了知识图谱中丰富的语义信息以及由这些语义信息所代表的先验知识。语义信息是指实体和关系的含义&#xff0c;比如“北京”是“中国”的首都&#xff0c;“苹果”是一种水果。先验知识则…

uniapp编译成h5后接口请求参数变成[object object]

问题&#xff1a;uniapp编译成h5后接口请求参数变成[object object] 但是运行在开发者工具上没有一点问题 排查&#xff1a; 1&#xff1a;请求参数&#xff1a;看是否是在请求前就已经变成了[object object]了 结果&#xff1a; 一切正常 2&#xff1a;请求头&#xff1a;看…

yolov8-obb训练自己的数据集(标注,训练,推理,转化模型)

一、源码 直接去下载官方的yolov8源码就行&#xff0c;那里面集成了 obb ultralytics/ultralytics/cfg/models/v8 at main ultralytics/ultralytics GitHub 二、环境 如果你训练过yolov5以及以上的yolo环境&#xff0c;可以直接拷贝一个用就行&#xff0c;如果没有的话 直…

破解数据孤岛:论数据中台对企业数据治理的作用与挑战-亿发

在数字化转型浪潮中&#xff0c;数据中台这一概念频频被提及。然而&#xff0c;业界目前尚未对数据中台形成统一的定义。本文将基于PowerData的理解&#xff0c;深入探讨数据中台的核心价值与挑战。 数据中台的本质 数据中台不仅仅是一项单一的技术&#xff0c;而是涵盖数据集…

R语言中交互式图表绘制

revenue <- read.csv("data/revenue.csv") 数据集放在了文章末尾&#xff0c;需要自取。 if(!require(plotly)) install.packages("plotly") # 绘制柱状图 p <- plot_ly(revenue,y ~本周,x ~游戏名称,type "bar",name "本周&q…