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

news2024/11/16 23:48:48

1.工具类:队列和字典

export class DictionNary {
    // 字典的封装
    constructor() {
        this.items = {}
    }
    set(key, value) {
        // 添加键
        this.items[key] = value
    }
    has(key){
        // 判断键是否存在
        return this.items.hasOwnProperty(key)
    }
    get(key){
        // 获取键的value
        return 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.coloradmin.cn/o/1656260.html

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

相关文章

民航电子数据库:数据库的备份与恢复

目录 前言备份库级逻辑备份示例 恢复库级的逻辑恢复示例 前言 民航电子数据库的备份与恢复 备份 库级逻辑备份 备份目标库下所有的对象 。 因此 &#xff0c;库级逻辑备份需要由备份库的管理员&#xff08;SYSDBA&#xff09;登录至备份目标库进行操作。 语法格式 &#xff1…

粤港澳青少年信息学创新大赛 Python 编程竞赛(初中部分知识点整理)

一、考试大纲梳理 知识内容 知识目标 计算机基础与编程环境&#xff0c;历史&#xff0c;存储与网络变量定义和使用基本数据类型&#xff08;整型&#xff0c;浮点型&#xff0c;字符型&#xff0c;布尔型&#xff09;&#xff0c;数据类型的转换控制语句结构&#xff08;顺序…

微服务架构与Spring Cloud

1 微服务架构 1.1 微服务架构概述 微服务架构&#xff08;Microservice Architecture, MSA&#xff09;是一种新型的服务端架构设计方案&#xff0c;通过将应用程序拆分成多个小型、自治的服务&#xff0c;实现了服务的松耦合和快速迭代。 微服务架构特征主要包括以下几个方面…

✯ ✯ ✯ 绍兴ISO27001认证:信息安全新征程✯ ✯ ✯

&#x1f308;&#x1f308;绍兴ISO27001认证&#xff1a;&#x1f353;信息安全新征程&#x1f4af; &#x1f604;大家好&#xff01;今天&#xff0c;&#x1f601;我无比激动地想要和大家分享&#x1f352;一个关于我们⭐绍兴的大新闻&#xff01;&#x1f389;&#x1f38…

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…

AI一键换装超强电商生产力工具下载

支持win版本&#xff0c;对电脑硬件有一定的要求。建议固态硬盘留足至少30 G的空间&#xff0c;显卡n卡显存至少4G。一些低端独立显卡可能还不如高配cpu集成。 程序文件比较大&#xff0c;因为涉及到大型模型。 下载链接在后面 下载链接&#xff1a; https://pan.baidu.com…

应聘项目经理,软考证书会是一个加分项吗?

加分项是必需的&#xff0c;特别是IT行业的项目经理职位。您可以在各大招聘网站上搜索项目经理职位&#xff0c;前景好、薪资高、待遇好的项目经理岗位&#xff0c;基本上都有证书的要求。非IT行业项目经理&#xff0c;可以考虑PMP证书或者其他与专业相关的证书&#xff0c;比如…

elementUI表格table文字不换行

在对应不需要换行的列加上属性&#xff1a;:show-overflow-tooltip"true" 即可

uniapp——列表分享当前话题(一个页面多个分享)

案例 分享的时候弹出对应的标题和默认第一张图片 代码 <view v-for"(item,index) in list" :key"index"><button open-type"share" :id"index" click.stop"()>{}"><image src"/static/images/cir…

马化腾用“不负众望”,来评价视为“全村希望”的视频号

我是王路飞。 2023年的视频号&#xff0c;给了腾讯足够的惊喜。 去年一年&#xff0c;视频号电商GMV实现近3倍增长&#xff08;约为1200亿&#xff5e;1500亿&#xff09;。2023年三季度&#xff0c;视频号总播放量同比增长超50%&#xff1b; 2023年视频号供给数量同比增长超…

上班不想用脑子写代码了怎么办?那就试试Baidu Comate啊宝贝

本文目录 前言1、视频编程实战1.1、熟悉代码库中的代码1.2、参考现有代码编写新代码 2、下载使用教程3、使用体验3.1、AutoWork 产品测评3.2、解决有关ajax请求后重定向问题3.3、询问编程相关知识3.3.1、cookie和session的区别与联系3.3.2、数据库中主键外键的相关知识 4、问题…

卡牌——蓝桥杯十三届2022国赛大学B组真题

样例输入 4 5 1 2 3 4 5 5 5 5样例输出 3样例说明 这 5 张空白牌中,拿2张写1,拿1张写2,这样每种牌的牌数就变为了3,3,3,4, 可以凑出 3套牌,剩下2张空白牌不能再帮助小明凑出一套。 评测用例规模与约定 对于30%的数据&#xff0c;保证n ⩽ \leqslant ⩽ 2000; 对于100%的数据…

区块链中的加密算法及其作用

区块链技术以其去中心化、不可篡改、透明公开的特性&#xff0c;在全球范围内引发了广泛的关注和讨论。其中&#xff0c;加密算法作为区块链技术的核心组成部分&#xff0c;对于维护区块链网络的安全、确保数据的完整性和真实性起到了至关重要的作用。本文将详细介绍区块链中常…

手写SpringBoot核心功能流程

本文通过手写模拟实现一个简易版的Spring Boot 程序&#xff0c;让大家能以非常简单的方式知道Spring Boot大概的工作流程。 工程依赖 创建maven工程&#xff0c;并创建两个module springboot模块&#xff1a;手写模拟springboot框架的源码实现 test模块&#xff1a;业务系统…

【刷题篇】双指针(二)

文章目录 1、有效三角形的个数2、查找总价格为目标值的两个商品3、三数之和4、四数之和 1、有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 class Solution { public:int triangleNumber(vector<int>& n…

《MySQL对数据库中表的结构的操作》

文章目录 一、建表二、查看表结构所有能查看到数据库&#xff0c;表的操作痕迹的本质都是服务器保存下来了这些操作记录。 三、修改表1.改表名字2.添加表记录3.添加表的更多字段4.修改表的字段5. 删除表的字段 四、修改表的数据1.删除表的数据2.修改表的数据3.向表中添加数据 总…

【go项目01_学习记录02】

学习记录 1 新建项目2 自动重载安装air安装完成&#xff0c;查看版本&#xff1a;air -v使用air: air 3 设置标头4 如何知道 http 包有哪些接口呢&#xff1f;5 Web 数据响应6 小结 1 新建项目 windows系统&#xff0c;cmd&#xff1a; cd %GOPATH%/src //%GOPATH%表示取环境变…

【模型的量化 神经网络量化】对称量化与非对称量化 无符号数量化 有符号数量化

文章目录 量化方法1.非对称量化1.1 无符号量化&#xff08;uint8)1.2 有符号量化&#xff08;int8)1.3 代码1.4总结 2 对称量化2.1 无符号量化&#xff08;uint8)2.2 有符号量化&#xff08;uint8)2.3总结2.4 程序代码 减少模型大小&#xff1a;通过将模型的权重和激活值从浮点…

从抖音阳哥的经验看,选品师项目是否值得你投入?

在抖音这个短视频平台上&#xff0c;无数的创作者分享着他们的知识和经验&#xff0c;其中阳哥作为一个备受关注的博主&#xff0c;他的每一次分享都能引起广大网友的热烈讨论。最近&#xff0c;阳哥分享了一个名为“选品师”的项目&#xff0c;让许多对电商和抖音运营感兴趣的…

SpringCloud2024最新版链路追踪教程micrometer+zipkin

本文基于B站尚硅谷2024版springcloud教学视频&#xff0c;主要用于自己学习记录以及分享技术&#xff0c;侵权私删 自己本机环境信息&#xff1a; jdk&#xff1a;17.0.10springboot&#xff1a;3.2.0springcloud&#xff1a;2023.0.0 micrometer 之前行业内使用的分布式链路…