【数据结构】图论存储革新:十字链表双链设计高效解决有向图入度查询难题
十字链表
- 导读
- 一、邻接表的优缺点
- 二、十字链表
- 2.1 结点结构
- 2.2 原理解释
- 2.2.1 顶点表
- 2.2.2 边结点
- 2.2.3 十字链表
- 三、存储结构
- 四、算法评价
- 4.1 时间复杂度
- 4.2 空间复杂度
- 五、优势与劣势
- 5.1 优势
- 5.2 劣势
- 5.3 特点
- 结语
导读
大家好,很高兴又和大家见面啦!!!
在图的链式存储探索中,我们曾解析邻接表的灵活性与局限——它虽以链表动态管理边集,却难解有向图入度查询的效率困局。
如何让存储结构在空间与时间上实现双重突破?
本文将聚焦一种革新设计——十字链表,它通过顶点表双向关联出边与入边,以共享边节点的巧思,实现出入度的高效统管。
从结构定义到代码落地,层层拆解这一“双向链表”如何为有向图赋予全新生命力!
一、邻接表的优缺点
邻接表作为图的链式存储结构,通过顺序存储的顶点表能够快速的访问各个顶点的信息,通过链式存储的边表,能够动态的对边集进行增加与删除操作;
相比于邻接矩阵的利用空间换时间,邻接表通过链表存储边的信息,大大降低了空间的消耗。
顶点表中的每个结点都可以通过边表头指针域来管理边的信息。对于有向图而言,邻接表则是能够通过出边表快速获取顶点的出度信息;
但是,在有向图中,除了出度还有入度。当我们需要获取一个顶点x的入度信息时,我们只能够消耗大量的时间遍历整个邻接表,通过判断其他顶点的出边表中是否存在弧头尾为x的结点,以此来获取顶点x的入度信息。
如果说我们能够在顶点表中同时管理出度和入度的信息,那么邻接表的这个短板是不是就被解决了呢?
通过顶点表同时管理出度与入度信息的数据结构就是我们今天要介绍的十字链表;
二、十字链表
十字链表(Orthogonal List)是有向图的一种链式存储结构,它的是实现与邻接表一样,通过顺序表存储顶点信息,通过链表存储弧的信息。
2.1 结点结构
在十字链表中,存储顶点信息的顺序表我们同样将其称之为顶点表。与邻接表不同的是,十字链表顶点表不仅能够管理结点的出度,还能够管理结点的入度。
十字链表中的顶点表的各个顶点结点有3个域:
- data域:用于存放顶点数据信息
- firstin域:指向以该顶点为弧头的第一条弧(入度)
- firstout域:指向以该顶点为弧尾的第一条弧(出度)
在十字链表中,管理边的链表有两个:
- 出边链表(邻接表):用于存放顶点的出边信息
- 入边链表(逆邻接表):用于存放顶点的入度信息
链表中的每一个结点都由五部分组成:
- tailvex域:存放弧尾的顶点编号
- headvex域:存放弧头的顶点编号
- hlink域:存放弧头相同的下一条弧
- tlink域:存放弧尾相同的下一条弧
- info域:存放该弧的相关信息
十字链表的图看上去似乎密密麻麻的箭头,无法正确的辨别到底谁是谁。接下来我们就来理解以下十字链表的原理;
2.2 原理解释
2.2.1 顶点表
十字链表通过顶点表存储顶点信息并且管理出边表和入边表。
- 出边表就是邻接表:以该顶点为弧尾,其它顶点为弧头的弧对应的边结点所组成的链表
- 如弧 < a , b > <a, b> <a,b>就是顶点a的邻接表中的边结点
- 我们可以通过指向出边表的指针
firstout
找到以该顶点为弧尾的所有弧;
- 入边表就是逆邻接表:以其它顶点为弧尾,该顶点为弧头的弧对应的边结点所组成的链表
- 如弧 < a , b > <a, b> <a,b> 就是顶点b的逆邻接表中的边结点
- 我们可以通过指向入边表的指针
firstin
找到以该顶点为弧头的所有弧;
2.2.2 边结点
在十字链表中,出边表和入边表中的结点是共用的,也就是说同一个结点会同时存在于两个边表中,因此我们这里主要分析边结点的作用;
在边结点中,通过弧尾顶点域和弧头顶点与存储对应顶点的编号信息:
tailvex
: 记录弧尾的编号信息;headvex
: 记录弧头的编号信息;
通过记录的编号信息,我们就可以在顶点表中找到该顶点的信息,这样我们就能够确定当前边结点所对应的弧;
边结点中的头链域hlink
所指向的是由所有弧中弧头结点相同的弧对应的边结点所组成的链表;
这里比较绕,我们通过图示来理解:
在上示的有向图中,有4条弧 E = { < a , b > , < b , c > , < c , b > , < d , c > } E = \{<a, b>, <b, c>, <c, b>, <d, c>\} E={<a,b>,<b,c>,<c,b>,<d,c>},如果我们将弧头相同的弧放入一个链表中,那么我们就可以得到两个头链表:
- < a , b > , < c , b > <a, b>, <c, b> <a,b>,<c,b> 这两条弧的弧头相同,都是以顶点 b b b 为弧头,因此这两条弧对应的边结点在同一个头链表中;
- < b , c > , < d , c > <b, c>, <d, c> <b,c>,<d,c> 这两条弧的弧头相同,都是以顶点 c c c 为弧头,因此这两条弧对应的边结点在同一个头链表中;
同理,尾链域tlink
所指向的是由所有弧中弧尾结点相同的弧对应的边结点所组成的链表;
边结点中的信息域info
存储的是该结点对应的弧的信息,比如该弧的权值。
因此如果我们是通过十字链表存储一张有向网,那么我们就需要通过该域记录每条弧的权值;
若我们存储的是普通的有向图,我们是可以省略info
域的。
2.2.3 十字链表
十字链表是由顶点表和所有的边结点相互关联所形成的一张交叉链表:
- 顶点表中将各顶点分为两个链表:
- 出边表:由该顶点为弧尾的边结点组成的链表
- 入边表:由该顶点为弧头的边结点组成的链表
- 边结点又通过头链域和尾链域自动分成了两个链表:
- 头链表:由弧头编号相同的顶点所组成的链表
- 尾链表:由弧尾编号相同的顶点所组成的链表
十字链表中的所有边结点不管是按照出入边的方式进行分类还是按照弧头弧尾的方式进行分类,同一个结点一定会同时归属于两个链表中,这里我们以弧 < a , b > <a, b> <a,b> 为例:
- 按出边与入边的方式分类:
- < a , b > → 结点 b 的入边 ↓ 结点 a 的出边 <a, b> → 结点b的入边 \\ \hspace{1em}\downarrow \\结点a的出边 <a,b>→结点b的入边↓结点a的出边
- 按照弧头弧尾的方式进行分类:
- < a , b > → 以结点 b 为弧头 ↓ 以结点 a 为弧尾 <a, b> → 以结点b为弧头\\ \hspace{1em}\downarrow \\以结点a为弧尾 <a,b>→以结点b为弧头↓以结点a为弧尾
可以看到,不管是那种分类方式,对于弧 < a , b > <a, b> <a,b> 而言,它都是同时存在于两个链表中,并且这两个链表我们可以认为其在逻辑上十字相交。
右上角的出边表与入边表组成的链表矩阵中,我们可以看到每一个结点所处的位置正好是对应两个链表的十字交点,因此这种存储结构称为十字链表。
三、存储结构
十字链表的存储结构与邻接表一样,都是需要定义两种结点类型;
与邻接表不同的是两种结点的结构上有所区别:
#define MAXSIZE 5
typedef char VexType;
typedef int ArcType;
//边结点
typedef struct ArcNode {int tailvex; // 弧尾顶点编号int headvex; // 弧头顶点编号struct ArcNode* hlink; // 头链表指针struct ArcNode* tlink; // 尾链表指针ArcType info; // 边信息(权值),可以省略
}ArcNode;
//顶点结点
typedef struct VexNode {VexType data; // 顶点信息ArcNode* firstin; // 入边表(逆邻接表)ArcNode* firstout; // 出边表(邻接表)
}VexNode;
//十字链表
typedef struct Orthogonal_List {VexNode vex_list[MAXSIZE]; // 顶点表int vex_num; // 当前顶点数两int arc_num; // 当前弧的数量
}OLGraph;
整个结构的定义并不困哪,我们只需要在邻接表的基础上稍作修改即可,这里就不再展开;
这里需要注意,如果当前的有向图就是一张普通的有向图,那么我们就可以在边结点中省去信息域info
;
在顶点表中,我们也可以通过增加两个变量分别记录该顶点的出度与入度,这个就看个人习惯了。
四、算法评价
对十字链表的算法评价我们同样以十字链表的遍历进行评价;
4.1 时间复杂度
当我们对一个十字链表进行遍历时,实际上就是在遍历顶点表的基础上,分别对每个顶点的邻接表和逆邻接表进行遍历;
对于有向图,所有顶点的入度之和、出度之和与边的总数满足以下关系:
∑ v ∈ V deg − ( v ) = ∑ v ∈ V deg + ( v ) = ∣ E ∣ \sum_{v \in V} \deg^{-}(v) = \sum_{v \in V} \deg^{+}(v) = |E| v∈V∑deg−(v)=v∈V∑deg+(v)=∣E∣
其中
- deg − ( v ) \deg^{-}(v) deg−(v):顶点 v v v 的入度(指向 v v v 的边数)。
- deg + ( v ) \deg^{+}(v) deg+(v):顶点 v v v 的出度(从 v v v 出发的边数)。
- ∣ E ∣ |E| ∣E∣:图的边的总数。
因此当我们要遍历整个有向图时,我们只需要遍历顶点以及所有顶点的入度或者所有顶点的出度即可,对应的时间复杂度为: T ( N ) = O ( ∣ V ∣ + ∣ E ∣ ) T(N) = O(|V| + |E|) T(N)=O(∣V∣+∣E∣)
4.2 空间复杂度
在十字链表中,我们只需要给每个顶点申请一个结点空间,给每条弧申请一个结点空间即可,因此其所对应的空间复杂度应该是: T ( N ) = O ( ∣ V ∣ + ∣ E ∣ ) T(N) = O(|V| + |E|) T(N)=O(∣V∣+∣E∣)
五、优势与劣势
5.1 优势
在十字链表中,因为我们通过顶点表同时管理了一个结点的出度与入度,因此相比于邻接表,十字链表大大提高了查找顶点入度的效率;
在十字链表中,出边表和入边表共享着所有的边结点,避免了管理出边表与入边表时的双重存储,大大节省了内存空间
由于十字链表在存储边结点时采用的是链表的形式,因此支持动态的弧的插入与删除;
当我们遇到需要同时处理出入与入度的问题时,我们就可以通过十字链表来快速实现;
5.2 劣势
十字链表的存储对象被限制在了有向图,该数据结构能且仅能存储有向图,无法实现无向图的存储;
由于十字链表需要同时管理结点的出度与入度,因此我们在实现的过程中,其代码量会十分的庞大;
5.3 特点
十字链表相当于将邻接表中无法管理入度的不足以及邻接矩阵中空间消耗过大的不足同时完善了,因此十字链表十分适合进行有向稀疏图的存储;
十字链表与邻接表一样,因为对有向边采用的是链表进行的存储,因此一张图所对应的十字链表并不是唯一的,但是一个十字链表表示的一定是一张确定的有向图;
结语
十字链表以顶点表为枢纽,通过出边与入边链表的交叉绑定,攻克了邻接表处理有向图入度的效率短板。其“一节点双归属”的设计,既保留了链表的动态扩展性,又避免了邻接矩阵的空间冗余,成为稀疏有向图的优选方案。
无向图中一条边需被两个顶点共享,如何避免重复存储?下一篇将揭秘邻接多重表的精妙设计,看它如何以“边节点共享”破局!
🔍 本文是否让你对链式存储的迭代有了新认知?点赞❤️支持原创深度解析!
📁 收藏随时回溯技术细节,转发🔗与团队探讨方案优化。
💬 评论区畅聊你的存储设计心得,或抛出疑惑共同探讨!
🔔 关注不迷路,下篇《邻接多重表:无向图存储的优雅解法》即将上线!
🚀 你的每一次互动,都是技术深水区探索的助力!
相关文章:
【数据结构】图论存储革新:十字链表双链设计高效解决有向图入度查询难题
十字链表 导读一、邻接表的优缺点二、十字链表2.1 结点结构2.2 原理解释2.2.1 顶点表2.2.2 边结点2.2.3 十字链表 三、存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、优势与劣势5.1 优势5.2 劣势5.3 特点 结语 导读 大家好,很高兴又和大家见面啦ÿ…...
【JavaScript】十五、事件对象与环境对象
文章目录 1、事件对象1.1 获取事件对象1.2 常用属性1.3 案例:回车发布评论 2、环境对象this3、回调函数4、案例:tab切换5、案例:全选文本框📖 1、事件对象 事件对象: 也是个对象,object,里面存…...
OJ--第N个泰波那契数列
1137. 第 N 个泰波那契数 - 力扣(LeetCode) 1 题干部分 2 拆解 1 状态表示:dp[i] 2 状态转移方程:dp[i]dp[i-1]dp[i-2]dp[i-3] 3 初始化:让dp[0]0,dp[1]dp[2]1 4 填表顺序:从dp[3]开始填从左往右填 5 返回值:dp[n]即为返回的…...
Python从入门到高手8.1节-元组类型详解
目录 8.1.1 理解元组类型 8.1.2 元组的类型名 8.1.3 元组的定义 8.1.4 元组的解包 8.1.5 元组是可迭代的 8.1.6 假期就这么结束了 8.1.1 理解元组类型 元组与列表有着相同的数据结构,区别在于,元组是不可变的数据类型,而列表是可变的数…...
使用 Qt 和 OBS 工具检测系统硬件编码器支持情况(NVENC、QSV、AMF)
在开发涉及视频处理的软件时,判断系统是否支持硬件加速编码器(如 NVIDIA NVENC、Intel QSV、AMD AMF)对于性能优化至关重要。本文将介绍如何结合 Qt 与 OBS Studio 附带的小工具程序,实现一个完整、异步且不会卡住 UI 的硬件加速检测模块。 一、背景与目标 硬件加速编码器…...
Python爬虫生成CSV文件的完整流程
引言 在当今数据驱动的时代,网络爬虫已成为获取互联网数据的重要工具。Python凭借其丰富的库生态系统和简洁的语法,成为了爬虫开发的首选语言。本文将详细介绍使用Python爬虫从网页抓取数据并生成CSV文件的完整流程,包括环境准备、网页请求、…...
图论:多源最短路
多源最短路 B3647 【模板】Floyd - 洛谷 #include<iostream> #include<cstring> using namespace std;const int N 110; int f[N][N]; int n, m;int main() {memset(f, 0x3f, sizeof(f));//对于重边的处理取较小值,所以要把全部都初始化成无穷大&…...
2024年已备案大模型发展趋势分析
2024年已备案大模型发展趋势分析 随着生成式人工智能技术的快速发展,其在各个领域的应用逐渐深入。为了规范和促进生成式人工智能服务的健康发展,国家互联网信息办公室发布了《生成式人工智能服务已备案信息》。本文将基于已备案信息,分析生成式人工智能服务的发展趋势,并…...
spring功能汇总
1.创建一个dao接口,实现类;service接口,实现类并且service里用new创建对象方式调用dao的方法 2.使用spring分别获取dao和service对象(IOC) 注意 2中的service里面获取dao的对象方式不用new的(DI) 运行测试: 使用1的方式创建servic…...
Transformer - Feed Forward前馈网络
一、数学原理 1. 前馈神经网络公式 2. Dropout公式 二、代码实现 import math import torchimport torch.nn as nnclass FeedForward(nn.Module):def __init__(self, d_model, dff, dropout):super().__init__()self.W1 nn.Linear(d_model, dff)self.W2 nn.Linear(dff, d_mo…...
Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台 截图
截图功能 Compose MultiplatformKotlin Multiplatfrom下实现桌面端的截图功能,起码搞了两星期,最后终于做出来了,操作都很流畅,截取的文件大小也正常,可参考支持讨论! 功能效果 代码实现 //在jvmMain下创…...
算法题(119):高精度减法
审题: 本题高精度减法主要是要区分正负号,然后进行模拟 思路: 方法一:模拟法 首先本题需要我们利用字符串进行大数相减 第一步:区分s1和s2谁更大 先从数的位数进行判断,然后再从高到低的位数进行判断 第二步…...
使用成员函数指针数组简化C++类中的操作
使用成员函数指针数组简化C类中的操作 在C编程中,我们常常会遇到需要对一组相似的操作进行处理的情况。例如,在一个游戏引擎中,你可能希望角色能够执行一系列的动作,如行走、跳跃或攻击等。为了简化这些操作的管理和调用…...
WebGL数学手记:矩阵基础
一、矩阵的定义 矩阵,数学术语。在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。 1.英文发音(Matrix) Matrix的发音类似于中文的[美吹克斯],知道它的发音。方便后期看教程时…...
Python爬取数据(二)
一.example2包下的 1.re模块的compile函数使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #参数2:指定起始位置(包含),参数3:终止位置(包含),…...
我的NISP二级之路-01
目录 一.SSE-CMM系统安全工程-能力成熟度模型(Systems Security Engineering - Capability Maturity Model) 二.ISMS 即信息安全管理体系(Information Security Management System),是一种基于风险管理的、系统化的管理体系 三.Kerberos协议 1. 用户登录与 AS 请求 2…...
自制简易 Shell:像搭建积木小屋一样打造命令交互小天地
目录 准备工作:搭建小屋的材料 打造小屋的 “身份牌” 接收指令:小屋的 “对讲机” 拆解指令:把大任务拆成小积木 执行指令:小屋的 “行动队” 特殊指令:小屋的 “特色功能” 小屋的日常运转 完整代码 啥是 …...
WEB安全--内网渗透--利用Net-NTLMv2 Hash
一、前言 在前两篇文章中分析了NTLM协议中Net-NTLMv2 Hash的生成、如何捕获Net-NTLMv2 Hash,现在就来探讨一下在内网环境中,如何利用Net-NTLMv2 Hash进行渗透。 二、Net-NTLM Hash的破解 工具:hashcat 原理:利用其内部的字典对…...
MySQL 数据库操作指南:从数据库创建到数据操作
关键词:MySQL;数据库操作;DDL;DML 一、引言 MySQL 作为广泛应用的关系型数据库管理系统,对于开发人员和数据库管理员而言,熟练掌握其操作至关重要。本文章通过一系列 SQL 示例,详细阐述 MySQL…...
从传递函数到PID控制器
在过程控制中,按偏差的比例(P,Proportional)、积分(I,Integral)和微分(D,Differential)进行控制的PID控制器(亦称PID调节器)是应用最为…...
抓wifi无线空口包之Ubuntu抓包(二)
一、设置网卡信道和频段,并抓包 1、使用iwconfig查看自己机器的无线网卡名称 wangwang-ThinkCentre-M930t-N000:~$ iwconfig lo no wireless extensions. eno1 no wireless extensions. enxc8a3624ab329 no wireless extensions. wlx90de80d1b5b1 IE…...
使用protobuf编译提示无法打开包括文件: ‘absl/log/absl_log.h’: No such file or directory
问题原因 Protobuf 依赖 Abseil: Protobuf 3.20 版本开始依赖 Abseil,但你的系统未正确安装或配置 Abseil。 头文件路径未包含: 编译器找不到 absl/log/absl_log.h,可能是因为 Abseil 未正确安装或未在项目中设置包含路径。 …...
深入浅出Java 锁 | 源码剖析 | 万字解析
目录 硬件内存结构&Java内存模型 硬件内存结构 Java内存模型(JMM) JMM中三大特性:原子性、有序性、可见性 Java中有哪些锁? Java中锁可以分成悲观锁和乐观锁的实现。 乐观锁和悲观锁的区别,乐观锁一定好嘛&…...
java流程控制12:流程控制练习
流程控制练习 打印三角型 package com.zheng.struct;public class TestDemo {public static void main(String[] args) {//打印三角形 5行for(int i1;i<5;i){for(int j5;j>i;j--){System.out.print(" ");}for(int j1;j<i;j){System.out.print("*&quo…...
JAVA:ByteBuddy 动态字节码操作库的技术指南
1、简述 ByteBuddy 是一个功能强大的 Java 字节码操作库,可以帮助开发者在运行时动态生成和修改类,而无需直接接触复杂的 ASM API。它被广泛应用于框架开发、AOP(面向切面编程)、代理类生成、性能监控等领域。 2、ByteBuddy 的优…...
C语言学习记录(13)自定义类型:结构体
一、结构体变量的声明、创建和初始化 1.结构体变量的声明 结构体变量我们学操作符的时候就顺带讲了一点了,因为当时讲了结构体成员变量访问操作符.。 结构体变量不像int、float这种内置类型的,一旦创建,系统就知道这是干啥的,结…...
rtthread 软件SPI驱动, 支持mode0~3,MSB,LSB
rtthread的软件模拟SPI用的上层PIN驱动写,由于经过层层封装,时钟频率并不会太高,200MHz的MCU跑不到1MHz的时钟频率。所以最好是在底层就模拟好,给上层用。 头文件 struct io_poSOFT {gpio_type *port;uint16_t pin; }; typedef …...
C++自学笔记——动态创建对象
动态创建对象 1. 什么是动态创建对象? 在学习之前的知识点时,我们知道有静态存储期和自动存储期。 静态存储期的对象在程序的整个生命周期内都存在,全局变量和static修饰的局部变量都属于这一类。自动存储期的对象,这些对象在函…...
35.[前端开发-JavaScript基础]Day12-for循环中变量-华为商城-商品列表-轮播图
for循环中监听函数中打印变量 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wi…...
详细描述以太坊的gas、gaslimit、gasPrice
目录 一、Gas 是什么? ✅ 简要定义: 🧠 举例理解: 二、Gas Limit 是什么? ✅ 简要定义: 分两种: 举例说明: 三、Gas Price 是什么? ✅ 简要定义: 为什么它重要? 示例: 四、 EIP-1559 后的新机制(伦敦升级) 三个要素: 五、额外技巧(开发实用) 本文…...
【Java】Maven
一、概念 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。 二、Maven坐标 <groupId>com.itheima</groupId><artifactId>maven-project01</artifactId>&…...
PageCache
目录 一、PageCache的具体过程 二、具体实现代码 一、PageCache的具体过程 页缓存主要解决的是内存外碎片问题,并且直接和系统调用打交道。 申请过程如下: 当中心缓存中没有内存时,会去页缓存申请一个span结构,要经过下面几步: (1…...
Vue3实战五、面包屑,收缩菜单,高亮暗黑主题切换,全屏功能实现
目录 面包屑,收缩菜单,黑夜白夜样式,全屏功能实现收缩菜单按钮结合pinia功能实现第一步、定义布局配置的数据类型第二步、创建布局状态管理文件第三步、使用布局配置状态第四步、进行展开/收起左侧菜单逻辑第五步、动态切换左侧菜单宽度样式第六步、动态…...
Linux内核设计——(二)进程调度
目录 一、进程调度简介 二、多任务 三、调度器 3.1 I/O消耗型和处理器消耗型进程 3.2 进程优先级 3.3 CFS算法 3.4 实时调度策略 3.5 SCHED_FIFO 3.6 SCHED_RR 3.7 调度器入口 四、上下文切换 4.1 睡眠和唤醒 4.2 need_resched标志 4.3 用户抢占 4.4 内核抢占 一…...
【C++初阶】--- string类模拟实现
1.基础函数 1.1成员函数 成员函数主要是_str、_size、_capacity这三个。npos是size_t 的最大值,用于当作后续成员函数的参数的缺省值。 class string { private:char* _str nullptr;//指向字符串的指针size_t _size 0;//字符串长度size_t _capacity 0;//空间大小static c…...
Pythia 使用说明
Pythia 是一个由非营利研究组织 EleutherAI 开发的开源语言模型套件,专注于透明性和可复现性。它是为了推动自然语言处理(NLP)领域的开放研究而设计,尤其在模型训练过程和性能分析方面提供了详尽的文档和数据。 Pythia 的核心特点…...
python:获取某路径下所有图片的名称
可以使用 Python 的 os 模块或者 pathlib 模块来获取指定路径下所有图片的名称。以下是使用这两种方法实现的代码示例: 使用 os 模块 import osdef get_image_names_os(path):image_extensions (.jpg, .jpeg, .png, .gif, .bmp)image_names []for root, dirs, f…...
一个开源的 VS Code 大模型聊天插件:Light-at
这篇文章是一个开发杂谈。对于有经验的开发者来说,可能这个项目并不算特别复杂或者高技术,只是对我个人来说算一个里程碑,因此写篇杂谈文章记录一下。也许也能给起步者一些参考。 项目地址:https://github.com/HiMeditator/light-…...
图论学习笔记2
请先阅读图论学习笔记 1。 在这篇文章里,我们将继续以前 tarjan 求解的强连通分量和双连通分量,讲解其缩点相关内容。 也会讲解一些特殊的图:基环树与仙人掌图、最小树形图。 缩点 我们知道,将强连通分量、双连通分量缩点之后…...
蓝桥杯备赛---真题训练之15届省赛产品360度展示
题目 介绍 在电子商务网站中,用户可以通过鼠标或手势交互实现 360 度全方位查看产品,提升用户体验。现在需要你设计一个 Pipeline 管道函数,用于控制 360 度展示产品的动画序列,通过管道连接各个动画步骤,使产品以流畅…...
图论:单源最短路(BF算法+迪杰斯特拉算法+spfa算法)
单源最短路 概念 dijkstra实现(解决不了负权值) P3371 【模板】单源最短路径(弱化版) - 洛谷 #include<iostream> #include<vector> #include<cstring> using namespace std;typedef pair<int, int> PII…...
嵌入式学习(35)-TTS语音模块FT-VBM-OS支持ModbusRTU
一、概述 FT-TTS-R-01 (下简简“模块”)是一款可将串口传入的文本信息转成语音播报的控制器。块”可下接收任意字 符或者汉字,并通过 TTS 语音合成功能,清晰、准确、自然的合成并播放音频。该块”还带有 1 路继电器输出࿰…...
【Vue-组件】学习笔记
目录 <<回到导览组件1.项目1.1.Vue Cli1.2.项目目录1.3.运行流程1.4.组件的组成1.5.注意事项 2.组件2.1.组件注册2.2.scoped样式冲突2.3.data是一个函数2.4.props详解2.5.data和prop的区别 3.组件通信3.1.父子通信3.1.1.父传子(props)3.1.2.子传父…...
Github上一些使用技巧(缩写、Issue的Highlight)自用
1. GIthub中的一些缩写 LGTM ! 最近经常看到一些迷之缩写,感觉挺有意思的,但是有时候看到一些没见过的缩写还是有点懵逼,不过缩写确实也是很方便去review,这里就记录汇总一下;顺便加了一些git的基操单词(加…...
【团体程序涉及天梯赛】L1~L2实战反思合集(C++)
实战反思汇总记录 仔细审题,想好再写 L1-104 九宫格 - 团体程序设计天梯赛-练习集 易忽略的错误:开始习惯性地看到n就以为是n*n数组了,实际上应该是9*9的固定大小数组,查了半天没查出来 L1-101 别再来这么多猫娘了!…...
ubuntu下的node.js的安装
安装 node-v22.14.0-linux-x64.tar.xz 的步骤如下: 1. 下载和解压 如果尚未下载文件,可以通过 wget 下载(替换为实际下载链接): wget https://nodejs.org/dist/v22.14.0/node-v22.14.0-linux-x64.tar.xz解压文件&…...
VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr
手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M)-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…...
Linux下创建svn库 和 svn安装与操作
1.介绍 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。适合中小公司的开发人员不多的项目使用,相比git管理工具更简单. 2.安装svn 2.1 国际惯例 首先看…...
React-04React组件状态(state),构造器初始化state以及数据读取,添加点击事件并更改state状态值
1.React组件状态(state) 组件可以拥有状态(state),它是组件数据的私有部分,可以用来管理动态数据。状态仅适用于类组件,或者使用 React 的 Hook 时可以在函数组件中使用。 注意 组件中render方…...
第3课:MCP协议接口定义与开发实践
MCP协议接口开发实战:从标准化设计到跨语言SDK落地 一、引言:为什么接口标准化是多智能体协作的“刚需” 在多智能体系统中,不同语言开发的智能体、异构服务之间的通信效率往往受制于接口兼容性问题。MCP(Model Context Protoco…...