图:广度优先遍历(BFS)和深度优先遍历(DFS)

1.工具类:队列和字典

export class DictionNary {// 字典的封装constructor() {this.items = {}}set(key, value) {// 添加键this.items[key] = value}has(key){// 判断键是否存在return this.items.hasOwnProperty(key)}get(key){// 获取键的valuereturn this.has(key) ? this.items[key] : undefined}remove (key){// 删除键if(this.has(key)){delete this.items[key]return true}return false}keys(){// 获取所有的键return Object.keys(this.items)}values(){// 获取所有的值return Object}size(){// 获取键值对的数量return this.keys().length}clear(){// 清空字典this.items = {}}toString(){// 转换为字符串if(this.size() > 0){let objString = `{${this.keys().join(',')}}`return objString}else{return '{}'}}
}export class Queue {// 队列的封装constructor() {this.items = []}// 方法enqueue(element) {// 添加元素到队列this.items.push(element)}dequeue() {// 移除队列的第一个元素return this.items.shift()}front() {// 返回队列的第一个元素return this.items[0]}isEmpty() {// 判断队列是否为空return this.items.length == 0}size() {// 返回队列的元素个数return this.items.length}toString() {return this.items.toString()}}

2. 图的封装

class Graph {constructor() {// 顶点this.vertexes = []// 边this.edges = new DictionNary()}// 方法addVertex(v){// 添加顶点this.vertexes.push(v)// 顶点对于边数组的初始化this.edges.set(v, [])}addEdge(v1, v2){// 无向图中边的设置this.edges.get(v1).push(v2)this.edges.get(v2).push(v1)}toString(){let result = ''for(let i = 0; i < this.vertexes.length; i++){result += this.vertexes[i] + ' -> 'const neighbors = this.edges.get(this.vertexes[i])for(let j = 0; j < neighbors.length; j++){result += neighbors[j] + ' '}result += '\n'}return result}initializeColor(){// 顶点遍历颜色初始化const colors = []for(let i = 0; i < this.vertexes.length; i++){colors[this.vertexes[i]] = 'white'}return colors}bfs(firstVertex, callback){// 广度优先遍历// 顶点遍历测试// 1.层序遍历:Breadth-First Search (BFS)// 2.深度遍历:Depth-First Search (DFS)// 3.为了记录顶点是否被访问过,我们使用三种颜色定义顶点的状态// 1.白色:表示该顶点还没有被访问// 2.灰色:表示该顶点被访问过,但并未被探索(被探索意思是其所有相邻顶点都被访问过)// 3.黑色:表示该顶点被访问过且被完全探索// 1.初始化顶点颜色const colors = this.initializeColor()// 2.创建队列const queue = new Queue()// 3.将第一个顶点加入队列queue.enqueue(firstVertex)// 4.循环遍历队列while(!queue.isEmpty()){// 4.1.从队列中取出一个顶点const v = queue.dequeue()// 4.2.获取和该顶点相邻的顶点const neighbors = this.edges.get(v)// 4.3.将当前顶点的颜色设置为灰色(被访问过)   colors[v] = 'gray'// 4.4.遍历该顶点的所有相邻顶点for(let i = 0; i < neighbors.length; i++){const w = neighbors[i]if(colors[w] === 'white'){colors[w] = 'gray'queue.enqueue(w) }}// 4.5.将当前顶点设置为黑色(被探索)colors[v] = 'black'// 4.6.调用callback函数callback(v)}}dfs(initVertex, callback){// 1.初始化颜色const colors = this.initializeColor()// 2.递归函数this.dfsVisit(initVertex, colors, callback)}dfsVisit(vertexes, colors, callback){// 1.访问过节点置灰色colors[vertexes] = 'gray'// 2.调用callback函数callback(vertexes)// 3.获取和该顶点相邻的顶点const neighbors = this.edges.get(vertexes)for(let i = 0; i < neighbors.length; i++){const w = neighbors[i]if(colors[w] === 'white'){this.dfsVisit(w, colors, callback)}}// 4.访问完节点置黑色colors[vertexes] = 'black'}}

图测试用例

在这里插入图片描述

 const graph = new Graph()// 1.添加顶点const myVertices = ['A', 'B', 'C', 'D', 'E', 'F','G', 'H','I']for(let i = 0; i < myVertices.length; i++){graph.addVertex(myVertices[i])}// 2.添加边graph.addEdge('A', 'B')graph.addEdge('A', 'C')graph.addEdge('A', 'D')graph.addEdge('C', 'D')graph.addEdge('C', 'G')graph.addEdge('D', 'G')graph.addEdge('D', 'H')graph.addEdge('B', 'E')graph.addEdge('B', 'F')graph.addEdge('E', 'I')console.log(graph.toString())// 测试广度优先遍历let result = ''graph.bfs(graph.vertexes[0], function(v){result += v + ' '})console.log(result)// 测试深度优先遍历let deepRsult = ''graph.dfs(graph.vertexes[0], function(v){deepRsult += v + ' '})console.log(deepRsult)

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

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

相关文章

六级仔细阅读

画两到三个词&#xff0c;精准定位 要原文和同义都满足才选 先看题目&#xff0c;在看原文&#xff0c;不要先看选项 做不出答案就继续往下读&#xff0c;读出来了就不用继续读了 分清楚是问为什么还是是什么&#xff0c;是什么看前面&#xff0c;为什么看后面 不知道就优先…

力扣HOT100 - 215. 数组中第K个最大元素

解题思路&#xff1a; 快速选择&#xff0c;目标是找出数组中第 k 小&#xff08;或第 k 大&#xff09;的元素&#xff0c;而不是对整个数组进行排序。 &#xff08;需要和快排进行区分&#xff0c;快排的目的是排序&#xff09; 注意&#xff1a; i l - 1, j r 1; 为什…

Spring Boot集成zookeeper快速入门Demo

1.什么是zookeeper&#xff1f; Zookeeper 是一个开源的分布式协调服务&#xff0c;目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。它具有以下特性…

学习Java的日子 Day45 HTML常用的标签

Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点&#xff1a; * 文字…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

基于springboot实现毕业设计系统项目【项目源码+论文说明】

基于springboot实现毕业设计系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff…

绝地求生:盘点宝箱中能开出来的极品皮肤!

最近杜卡迪联名大伙儿不都开箱子出了一堆皮肤吗&#xff1f;很多人搞不清哪些皮肤要留&#xff0c;哪些皮肤可以分。 OK这篇文章稍微推荐几个我认为的高质量可兑换的皮肤&#xff0c;当然个人整理难免有疏漏&#xff0c;欢迎评论区补充。 余波学院黑丝袜 目前游戏里唯一一条显…

pgbackrest 备份工具使用 postgresql

为啥我会使用pgbackrest进行备份&#xff1f;因为postgresql没有自带的差异备份工具。。。而我们在生产环境上&#xff0c;一般都需要用到差异备份或者增量备份。我们的备份策略基本是&#xff0c;1天1次完整备份&#xff0c;1个小时1次差异备份。如果只需要完整备份&#xff0…

知识库文档系统源码部署/搭建/上线/运营/售后/更新

一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭建知识库…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M&#xff0c;GitHub 是会被限制推送到仓库中的&#xff0c;大概率情况会显示下面的错误&#xff1a; remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

LeetCode 513.找树左下角的值

LeetCode 513.找树左下角的值 1、题目 题目链接&#xff1a;513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null…

用字符串初始化的指针

一. 简介 前一篇文章简单学习了数组与指针的区别&#xff0c;文章如下&#xff1a; C语言中数组与指针的区别-CSDN博客 本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。 二. 初始化指针来指向字符串 初始化指针来指向字符串&#xff0c;例如如下代码就是…

SpringBoot 具体是做什么的?

Spring Boot是一个用于构建独立的、生产级别的、基于Spring框架的应用程序的开源框架。它的目标是简化Spring应用程序的开发和部署过程&#xff0c;通过提供一种快速、便捷的方式来创建Spring应用程序&#xff0c;同时保持Spring的灵活性和强大特性。 1. 简化Spring应用程序开…

信安标委发布16项网络安全国家标准:8项为旧标准替代,8项标准为新发布

1. 背景 根据2024年4月25日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2024年第6号&#xff09;&#xff0c;全国网络安全标准化技术委员会归口的16项国家标准正式发布。 2. 标准清单 本次国家标准涵盖了信息技术安全评估准则、…

AScript纯本地离线文字识别插件

目的 AScript是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但按键精灵是不包含图色功能&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下…

苹果M4芯片:推动AI时代的革新力量

随着科技的飞速发展&#xff0c;苹果公司一直以其创新精神引领着行业潮流。其中&#xff0c;M4芯片的推出无疑是苹果在人工智能领域迈出的重要一步。这款专为机器学习和AI计算而设计的芯片&#xff0c;不仅在新款iPad Pro等消费电子产品上亮相&#xff0c;更是预示着苹果即将开…

数据库的使用基础-SQL语句

一、在MYSQL中&#xff0c;创建数据库&#xff0c;语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];[ ]中的内容是可选的。语法说明如下&#xff1a; <数据库…

Mybatis入门之在基于Springboot的框架下拿到MySQL中数据

介绍 Java技术操作数据库 MyBatis是一款优秀的持久层框架 用于简化JDBC的开发 优秀的持久层框架 我们要基于Springboot整合Mybatis 实操 学习 基于Mybatis是如何操作数据库的 通过MyBatis书写SQL语句 SQL语句执行完毕后 会将查询结果返回给Java程序 表中数据会自动封装…

​​​【收录 Hello 算法】5.1 栈

目录 5.1 栈 5.1.1 栈的常用操作 5.1.2 栈的实现 1. 基于链表的实现 2. 基于数组的实现 5.1.3 两种实现对比 5.1.4 栈的典型应用 5.1 栈 栈&#xff08;stack&#xff09;是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子…

Java面试——MyBatis

优质博文&#xff1a;IT-BLOG-CN 一、MyBatis 与 JDBC 的区别 【1】JDBC 是 Java 提供操作数据库的 API&#xff1b;MyBatis 是一个持久层 ORM 框架&#xff0c;底层是对 JDBC 的封装。 【2】使用 JDBC 需要连接数据库&#xff0c;注册驱动和数据库信息工作量大&#xff0c;每…