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

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

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

在这里插入图片描述

深度优先搜索(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.mzph.cn/diannao/45488.shtml

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

相关文章

Qt图片缩放显示

在Qt中,如果你想显示图片的像素或者对图片进行缩放显示,可以使用 QImage 类来处理图片数据,并使用 QLabel 或自定义的 QWidget 来显示图片,但是很难通过鼠标进行缩放显示 QGraphicsView可以实现此功能 在Qt中,QGraphi…

《Windows API每日一练》9.2.1 菜单

■和菜单有关的概念 窗口的菜单栏紧挨着标题栏下面显示。这个菜单栏有时叫作程序的“主菜单”或“顶级菜单“(top-level menu)。顶级菜单中的菜单项通常会激活下拉菜单(drop-downmenu),也 叫“弹出菜单”(…

流程图怎么做?有三种制作方法

流程图怎么做?在日常生活和工作中,流程图作为一种直观展示步骤、流程或决策路径的工具,扮演着不可或缺的角色。它不仅能够帮助我们理清思路、规划任务,还能促进团队协作与沟通。那么,如何高效地绘制流程图呢&#xff1…

2024年最新PyCharm保姆级安装教程

PyCharm是一款专为Python开发者设计的集成开发环境(IDE),旨在帮助用户在使用Python语言开发时提高效率。 PyCharm作为一款强大的Python IDE,其主要作用在于提供了一整套可以帮助Python开发者提高开发效率的工具。这些工具包括但不…

2024 /7/14 H3U与MD600Modbus通讯应用指导

目录 步骤一:硬件接线 步骤二:变频器参数设置 步骤三:软件PLC程序配置 注意事项: 步骤一:硬件接线 PLC侧485端子 MD600变频器侧485端子 …

如何用码上飞解决企微上真实需求来接单赚米

在企微的工作台中有一个「需求模块」,所有的企微用户都可以在上面提出自己的需求。 例如张三说“在企微上我怎么样才可以把一个客户发的语音,转给另一个客户听?” 李四说“我需要一个能每天在工作群里定时发布信息并能自动修改日期的功能。…

HarmonyOS(44) Polyline模拟股票分时走势图

Polyline 前言Polyline初始化坐标集合开启定时器全部源码参考资料 前言 本篇博文使用折线组件Polyline来绘制股票实施走势图,通过本篇博客,你可以了解到State、定时器、Polyline的作用。同时可以加深对自定义组件的生命周期的理解。 Polyline 模拟股票…

Android11 SplashScreen 的显示和退出流程

应用的启动到显示到屏幕是需要一定的时间的,为了提升用户的体验,google加入了启动窗口,也就是SplashScreen SplashScreen显示流程 在应用的启动过程中,会调用到ActivityStarter的startActivityInner方法,具体可参考&a…

2024 China Joy 前瞻 | 腾讯网易发新作,网易数智携游戏前沿科技、创新产品以及独家礼盒,精彩不断!

今年上半年,CES、MWC和AWE三大国际科技展轮番轰炸,吸引全球科技爱好者的高度关注,无论是新潮的科技产品,还是对人工智能的探索,每一项展出的技术和产品都引起了市场的热议。而到了下半年,一年一度的China J…

AGE 在CTE表达式中使用Cypher

在使用CTE(公共表达式)时,没有对使用Cypher的限制。 查询: WITH graph_query as (SELECT *FROM cypher(graph_name, $$MATCH (n)RETURN n.name, n.age$$) as (name agtype, age agtype) ) SELECT * FROM graph_query;结果&#…

【Linux】进程7——查看进程

1.为什么进程管理这么重要呢? 这是因为: 首先,我们在操作系统时的各项任务其实都是经过某个PID来完成的(包括你的bash环境),因此,能不能执行某项任务,就与该进程的权限有关了。再来…

centos切换python默认版本的最简单步骤(随手记)

centos8默认安装的python版本是python3.6,当需要更高版本的python3.9或3.11时,我们经常搜索到源码安装然后编写软连接。 [rootmanager Python-3.9.0]# python3 --version Python 3.6.8 [rootmanager Python-3.9.0]# pip3 --version pip 9.0.3 from /usr…

RAG理论:ES混合搜索BM25+kNN(cosine)以及归一化

接前一篇:RAG实践:ES混合搜索BM25+kNN(cosine) https://blog.csdn.net/Xin_101/article/details/140230948 本文主要讲解混合搜索相关理论以及计算推导过程, 包括BM25、kNN以及ES中使用混合搜索分数计算过程。 详细讲解: (1)ES中如何通过BM25计算关键词搜索分数; (2)…

SpringBoot注解--11--@JSONField @JsonProperty

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一个问题:后端实体类isXXX开头的属性,传到前端后自动去掉is解决方法: JsonProperty和JSONField1.简介2.注解的区别2.1 底层框架不…

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

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

python库(12):Requests库实现HTTP请求

1 Requests库 Requests是一个极为流行的HTTP库,它允许你发送各种类型的HTTP请求。无论是GET、POST、PUT、DELETE还是其他类型的请求,Requests都能轻松搞定。 虽然还有其他HTTP库,但Requests库以其简洁的API和人性化的设计脱颖而出。它隐藏了…

寻找赛灵思IP核手册的办法

一、先google找到大家看的手册都是什么样的 二、在AMD技术手册网站搜索手册的名称 网址:AMD Technical Information Portal

科普文:spring boot中常用的接口、工具栏、注解整理

1.springboot 常用接口 1.1 Aware接口 Spring IOC容器中 Bean是感知不到容器的存在,Aware(意识到的)接口就是帮助Bean感知到IOC容器的存在,即获取当前Bean对应的Spring的一些组件,如当前Bean对应的ApplicationContext等。 1.1.1 Applicati…

python如何进行pip换源

hello,大家好,我是一名测试开发工程师,至今已在自动化测试领域深耕9个年头,现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦,请大家快来体验并关注我吧。 Python的包管理工具pip是开发者必备的利器之一。然…

企业公司网站建站自适应网站源码系统 前后端分离 带完整的源代码包以及搭建部署教程

系统概述 在数字化转型的浪潮中,企业网站已成为展示品牌形象、吸引潜在客户、促进业务交流的重要窗口。为了满足企业对于高效、灵活、易维护网站建设的迫切需求,小编给大家分享一款集先进技术与人性化设计于一体的“企业公司网站建站自适应网站源码系统…