数据结构与算法之图: 图及其深度和广度优先遍历实现 (Ts, Py, Go版)

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02 字段内容类型​云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表​端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)​。 阅读详情

图

  • 网络结构的抽象模型,是一组由边连接的节点
  • 图可以表示任何二元关系,道路,航班
    • 由边连接的节点
    • 图中节点多,但是一条边只能连接两个节点
  • js中没有图,但可以用Objct和Array构建图
  • 图的表示法:临接矩阵,临接表,关联矩阵…
    • 临接矩阵表示法:用矩阵表示
      • 比如这个图上有n个节点, A,B,C,…N
      • 我们画出一个矩阵,横纵都是A->N这n个节点
      • 这个矩阵默认全部填充0,
      • 如果A能连接到B,则在这个矩阵中以A为横轴,B为纵轴相交的那个点置为1表示
      • 如果B能连接到C,则在这个矩阵中以B为横轴,C为纵轴相交的那个点置为1表示
      • …
    • 邻接表表示法
      • 更形象,更容易理解,如下, 构建一个对象,对象的key是各个节点
      • 各个节点里面都有一个数组,数组中的值就是这些节点中可以连接的节点
      {
          A:["B"],
          B:["C", "D"],
          C:["E"],
          D:["A"],
          E:["D"]
      }
      
      • 里面除了用数组表示,还可以用链表来表示
      • 只要能表达清楚节点之间的链接关系,就可以了
  • 图的常用操作
    • 深度优先遍历
    • 广度优先遍历

Typescript 版深度优先遍历和广度优先遍历

这里有一个图的示例,对其进行深度和广度的优先遍历

// 邻接表表示法
const graph = {
    0: [1,2],
    1: [2],
    2: [0, 3],
    3: [3]
}

1 ) 深度优先遍历

  • 尽可能深的搜索图的分支
  • 访问根节点
  • 对根节点的没访问过的相邻节点挨个进行深度优先遍历
    • 这里相邻节点和树中的children差不多,概念上相似
    • 这里,没有访问过的节点(为了不重不漏)是一个重要的限制条件,如果不是这样,会陷入死循环
// 使用上面定义的通用graph变量
const visited = new Set();
const res = [];
// 深度优先遍历函数
const dfs = (n) => {
     // console.log(n); // 访问当前节点
     res.push(n); // 访问过的节点存入结果队列中
     visited.add(n);
     graph[n].forEach(c => {
         if(!visited.has(c)) {
             dfs(c); // 对没有访问过的节点进行递归
         }
     })
}

dfs(2) // 这里指定一个起始节点2 
console.log(res.toString()); // 2,0,1,3

2 ) 广度优先遍历

  • 先访问离根节点最近的节点
  • 口诀
    • 一、新建一个队列,把根节点入队
    • 二、把队头出队并访问
    • 三、把队头的没访问过的相邻节点入队
    • 重复第二、三步,直到队列为空
// 使用上面定义的通用graph变量
const res = []; // 用于存储最终的结果
// 广度优先遍历函数
const bfs = () => {
    const visited = new Set();
    visited.add(2); // 起始节点 注意这里结合下面的漏洞,先加入起始点
    const q = [2]; // 起始节点
    while(q.length) {
        const n = q.shift(); // 队首出队
        // console.log(n); // 访问当前节点
        res.push(n);
        // visited.add(n); // 这里不能在这里添加,会有漏洞,会漏掉一些在q里,但没有在visited中的元素,它会逃过限制,重复在q中被添加
        // 将相邻节点(孩子节点) 存入队列中
        graph[n].forEach(c => {
            // 没有访问过,push
            if(!visited.has(c)) {
                q.push(c);
                visited.add(c); // 将出队元素添加进入集合 这里结合上面注释掉的漏洞,后添加
            }
        })
    }
}

bfs();
console.log(res.toString()); // 2,0,3,1

Python3 版深度优先遍历和广度优先遍历


1 ) 深度优先


# 定义图
graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}

# 深度优先遍历函数
def dfs(n, visited, res):
    res.append(n)
    visited.add(n)
    for c in graph[n]:
        if c not in visited:
            dfs(c, visited, res)

# 主函数
def main():
    visited = set()
    res = []
    dfs(2, visited, res)  # 这里指定一个起始节点2
    print(','.join(map(str, res)))  # 输出: 2,0,1,3

if __name__ == "__main__":
    main()

2 ) 广度优先

# 定义图
graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}

# 广度优先遍历函数
def bfs(start):
    res = []
    visited = set()
    q = [start]
    visited.add(start)

    while q:
        n = q.pop(0)
        res.append(n)
        for c in graph[n]:
            if c not in visited:
                q.append(c)
                visited.add(c)

    return res

# 主函数
def main():
    res = bfs(2)
    print(','.join(map(str, res)))  # 输出: 2,0,3,1

if __name__ == "__main__":
    main()

Golang 版深度优先遍历和广度优先遍历


1 ) 深度优先


package main

import (
	"fmt"
)

// 定义图
var graph = map[int][]int{
	0: {1, 2},
	1: {2},
	2: {0, 3},
	3: {3},
}

// 深度优先遍历函数
func dfs(n int, visited map[int]bool, res *[]int) {
	*res = append(*res, n)
	visited[n] = true
	for _, c := range graph[n] {
		if !visited[c] {
			dfs(c, visited, res)
		}
	}
}

func main() {
	// 深度优先遍历
	visited := make(map[int]bool)
	res := []int{}
	dfs(2, visited, &res)
	fmt.Println("DFS:", res) // 输出: DFS: [2 0 1 3]
}

2 ) 广度优先

package main

import (
	"fmt"
)

// 定义图
var graph = map[int][]int{
	0: {1, 2},
	1: {2},
	2: {0, 3},
	3: {3},
}

// 广度优先遍历函数
func bfs(start int) []int {
	res := []int{}
	visited := make(map[int]bool)
	q := []int{start}
	visited[start] = true

	for len(q) > 0 {
		n := q[0]
		q = q[1:]
		res = append(res, n)
		for _, c := range graph[n] {
			if !visited[c] {
				q = append(q, c)
				visited[c] = true
			}
		}
	}

	return res
}

func main() {
	// 广度优先遍历
	resBFS := bfs(2)
	fmt.Println("BFS:", resBFS) // 输出: BFS: [2 0 3 1]
}
SAP Integration Suite 与 SAP Cloud Integration 的关系解析 SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层 阅读详情

相关推荐

Vitis开发环境下的双核ARM通信:Hello World背后的AMP架构解析

本文深入解析了Vitis开发环境下ZYNQ双核ARM Cortex-A9处理器的AMP架构与通信机制。通过详细的硬件配置、内存分配和核间通信实现步骤,展示了如何构建高效的双核Hello World系统,为嵌入式系统开发者提供了实用的开发指南和性能优化技巧。

weixin_29162439的博客 219

TypeScript 广度优先

privateallMap=newMap();//队列先进先出。 privateinitMap(){ this.allMap.set('My',['A','B','C']); this.allMap.set('A',['AA','AAA','AAAA']); this.allMap.set('B',['BB','BBB','BBBB']); this.allMap.set('C',['CC...

288

从报错到定位:Memtest86 DQ位算法解析与实践指南

本文深入解析了Memtest86内存测试工具报错信息的解读方法,重点介绍了通过地址解析、数据转换、位比对和DQ定位四步算法,精准锁定故障DQ位的实践流程。文章以DDR4和DDR5为例,详细拆解了从十六进制报错到二进制比对的完整步骤,并提供了从单个报错分析到故障模式诊断的进阶指南,帮助用户将抽象的报错信息转化为具体的维修或排查依据。

sre5engineer的博客 486

js实现深度优先与广度优先

深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。 深度优先遍历 (1)递归实现 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点(看该节点 是否还有除该子节点以外的节点,没有继续回退到父节点,有则遍历该子节点之外的其他节点),再从另一条路开始走

qq_26144233的博客 2025

【Win11】Photoshop cc 2019破解安装全攻略:从下载到修复

本文提供了在Windows 11系统上安装和激活Adobe Photoshop CC 2019的详细图文教程。核心步骤包括获取可靠安装包、断网执行纯净安装、替换破解文件以及解决常见的主页空白和性能优化问题,确保用户能顺利完成破解并流畅使用这款经典设计软件。

weixin_28559803的博客 402

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记

生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训...

weixin_43227526的博客 5491

js --- 图的深度广度优先遍历

深度优先遍算法口诀 访问根节点 对根节点的没有访问过的降临节点进行深度优先遍历 const graph = { 0:[1,2], 1:[2], 2:[0,3], 3:[3] } const visited = new Set() const dfs = (n) =>{ console.log(n) visited.add(n) graph[n].forEach(c => { if (!visited.has(c)){

wanghongpu9305的博客 266

YOLO26 改进 | (教师:YOLOv8L,学生:YOLO26) | 知识蒸馏 (Knowledge Distillation)

本文介绍了基于YOLO26框架的知识蒸馏实战方法,通过教师模型指导学生模型训练,在不增加推理成本的情况下提升模型精度。文章详细阐述了基于响应的知识蒸馏实现方案,通过最小化教师与学生模型预测Logits间的KL散度实现知识迁移。核心实现包括:1) 创建DistillationModel包装器类,同时运行师生模型;2) 自定义DistillationLoss,在原检测损失基础上增加KL散度损失。该方法适用于希望保持YOLO26轻量级特性同时获得接近大模型精度的场景,文中提供了完整的代码实现方案。

weixin_51988935的博客 510

js实现深度优先遍历和广度优先遍历

什么是深度优先和广度优先 其实简单来说 深度优先就是自上而下的遍历搜索 广度优先则是逐层遍历, 如下图所示 1.深度优先 2.广度优先 两者的区别 对于算法来说 无非就是时间换空间 空间换时间 深度优先不需要记住所有的节点, 所以占用空间小, 而广度优先需要先记录所有的节点占用空间大 深度优先有回溯的操作(没有路走了需要回头)所以相对而言时间会长一点 深度优先采用...

John的专栏 533

【ARXML专题】-2-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件

目录 1 创建一个AUTOSAR系统描述 2 物理层命名以及创建ECU 3 新建一个Frame 4 新建一个PDU 5 新建一个signal 6 结尾 AUTOSAR System Description Network Explorer是一个文件编辑器,支持可视化和编辑系统描述的AUTOSAR系统描述文件和ECU摘录的通信内容,它支持架构版本4.0.3、4.1.2、4.2.1、4.2.2和4.3.0。AUTOSAR系统描述(ARXML)文件是基于XML的文件格式,描述网络通信的元素...

「汽车电子助手」的博客 1万+

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2978

javascript实现图的广度优先搜索、深度优先搜素

用邻接表表示图:如下图所示的图: 用邻接表二维数组表示为:adj[0] = [1,2,5,6]; adj[1] = [0,3,8,9]; adj[2] = [0,4]; adj[3] = [1]; adj[4] = [2]; adj[5] = [0,7]; adj[6] = [0]; adj[7] = [5]; adj[8] = [1]; adj[9] = [1]构建图类: functi

景洪的博客 1873

LoRa无线通信技术介绍(六)SX127X芯片收发程序讲解

接收LORA芯片SX127X的收发程序。

DT程序员的博客 1752

算法与数据结构面试宝典——图的遍历

树代表的是“一对多”的关系,而图则具有更高的自由度,可以表示任意的“多对多”关系。因此,我们可以把树看作是图的一种特例。显然,。图和树都都需要应用搜索算法来实现遍历操作。图的遍历方式可分为两种:「广度优先遍历 breadth-first traversal」和「深度优先遍历 depth-first traversal」。它们也常被称为「广度优先搜索 breadth-first search」和「深度优先搜索 depth-first search」,简称 BFS 和 DFS。

白话机器学习 321

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

数据结构与算法之二叉树: LeetCode 104. 二叉树的最大深度 (Ts, Py, Go版)

给定二叉树 [3,9,20,null,null,15,7]二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。给定一个二叉树,找出其最大深度。返回它的最大深度 3。

Wang的专栏 689

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构与算法之二叉树: LeetCode 111. 二叉树的最小深度 (Ts, Py, Go版)

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。就 给定一个二叉树,找出其最小深度。说明:叶子节点是指没有子节点的节点。

Wang的专栏 699

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构与算法之图: LeetCode 133. 克隆图 (Ts, Py, Go版)

图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。时间复杂度:O(n)空间复杂度:O(n)

Wang的专栏 290

数据结构与算法之数组: LeetCode 17. 电话号码的字母组合 (Ts, Py, Go版)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

Wang的专栏 1191

数据结构与算法之二叉树: LeetCode 112. 路径总和 (Ts, Py, Go版)

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回 true;否则,返回 false。叶子节点 是指没有子节点的节点。

Wang的专栏 664

数据结构与算法之二叉树: LeetCode 101. 对称二叉树 (Ts, Py, Go版)

1 )深度优先递归版本。2 )广度优先迭代版本。

Wang的专栏 764

hello-algo:Python 图广度优先遍历(BFS)的队列实现与 PythonTutor 可视化详解

在《Hello 算法》(hello-algo)中,图的广度优先遍历(Breadth-First Search,BFS)是“由近及远、逐层扩张”的经典遍历范式,通常借助队列实现。本文以仓库中 [PythonTutor 可视化文档](https://link.gitcode.com/i/f37f044d732e771b1ac8c3aaf6e4efac) 为骨架,逐行讲解其中完整的 Python 代码—

gitblog_00529的博客 303

数据结构与算法之二叉树: LeetCode 226. 翻转二叉树 (Ts, Py, Go版)

1 )深度优先递归版本。2 )广度优先迭代实现。

Wang的专栏 480

GLM-5.3开源编程模型实战:本地部署、多语言测试与工作流集成指南

大语言模型在代码生成领域的应用正从通用对话向专用编程模型演进。其核心原理在于通过海量高质量代码数据的专项训练,使模型深入理解编程语言的语法、语义和项目上下文,从而生成符合规范的代码片段乃至完整模块。这类技术的核心价值在于提升开发效率、保障代码一致性,并能在私有化部署场景下确保数据安全。典型的应用场景包括自动化代码补全、跨语言项目开发辅助、代码审查与调试解释等。本文聚焦于智谱AI最新发布的开源编程专用模型GLM-5.3,通过详尽的本地部署方案、多语言代码生成测试以及主流IDE集成实践,为开发者提供从环境搭建到

weixin_30666401的博客 473

JS实现图的深度优先遍历(DFS)和广度优先遍历(BFS)

1 建立测试图(邻接矩阵和邻接表存储形式) 首先建立一个图用于后续代码的测试,在此以无向图为例,且所有边的权值都为1。存储方式分别为邻接矩阵和邻接表(见上一篇介绍) 邻接矩阵: class Graph{ constructor(v,vr){ let len = v.length this.vexs = [].slice.apply(v); let arcs = []; for ...

zjw_python的博客 2991

JS 中的广度与深度优先遍历

现在有一种类似树的数据结构,但是不存在共同的根节点 root,每一个节点的结构为 {key: 'one', value: '1', children: [...]},都包含 key 和 value,如果存在 children 则内部会存在 n 个和此结构相同的节点,现模拟数据如下图:已知一个 value 如 3-2-1,需要取出该路径上的所有 key,即期望得到 ['three', 'three-...

前端老兵 4399

用JavaScript实现图的广度优先和深度优先遍历

文章目录1.图的相关术语2.图的表示2.1.邻接矩阵2.2.邻接表2.3.关联矩阵3.创建图类3.1.创建字典类3.2.创建图类3.3.创建实例输出的结果为:4.图的遍历4.1.广度优先遍历思路:添加bfs方法创建bfs实例bfs输出结果使用BFS寻找最短路径创建BFS实例BFS输出结果4.2.深度优先遍历思路:添加dfs方法创建dfs实例dfs输出结果 1.图的相关术语 1.1.有一条边相连的顶...

weixin_42126431的博客 838
上一篇: 数据结构与算法之堆: LeetCode 313. 超级丑数(Ts, Py, Go版)
下一篇: WebGL笔记:图形转面的原理与实现
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值