【数据结构】图论存储结构深度解析:邻接多重表如何实现无向图O(1)删边?邻接矩阵/链表/十字链对比
邻接多重表
- 导读
- 一、有向图的存储结构
- 二、邻接多重表
- 三、存储结构
- 四、算法评价
- 4.1 时间复杂度
- 4.2 空间复杂度
- 五、四种存储方式的总结
- 5.1 空间复杂度
- 5.2 找相邻边
- 5.3 删除边或结点
- 5.4 适用于
- 5.5 表示方式
- 六、图的基本操作
- 结语
导读
大家好,很高兴又和大家见面啦!!!
经过前面的内容,我们已经学习了图的三种存储结构:
- 邻接矩阵
- 邻接表
- 十字链表
在今天的内容中我们将会介绍图的第四种存储结构以及图的一些基本操作。下面我们直接进入今天的内容;
一、有向图的存储结构
在有向图中,我们可以通过3种存储结构来存储有向图的顶点与弧的信息,并且这三种存储结构各有其优缺点:
- 邻接矩阵
- 优点:能高效查找两个顶点之间的边,适合存储稠密图
- 不足:会浪费大量的存储空间
- 邻接表
- 优点:通过链式存储大大节省了存储空间,适合存储稀疏图
- 不足:边的查找效率低下
- 十字链表
- 优点:提高了弧的查找效率,节省了存储空间
- 不足:十字链表只能存储有向图
相较于邻接矩阵与邻接表,十字链表不仅提高了弧的查找效率,还节省了存储空间。
但是十字链表法并不能像邻接矩阵和邻接表一样不仅可以存储有向图,还可以存储无向图,十字链表法只能够存储有向图。
那对于无向图而言,有没有一种存储结构既能够提高边的查找效率,又能够节省存储空间呢?
二、邻接多重表
在邻接表中,容易求得顶点和边的各种信息,但求两个顶点之间是否存在边儿执行删除边等操作时,需要分别在两个顶点的边表中遍历,效率低。
邻接多重表(Adjacency Multilist)是无向图的一种链式存储结构。与十字链表类似,在邻接多重表中,每条边用一个结点表示,其结构如下所示:
其中:
ivex
与jvex
中存储的是该边依附的两个顶点编号;ilink
指向的时依附于顶点i
的下一条边jlink
指向的时依附于顶点j
的下一条边info
中存放的时该边的相关信息,如边的权值
每个顶点也用一个结点表示,它由两个域组成:
data
域存放该顶点的相关信息firstedge
域指向的时依附于该顶点的第一条边
在邻接多重表中,所有依附于同一顶点的边串联在同一链表中,因为每条边依附于两个顶点,所以每个边结点同时链接在两个链表中。
在无向图中,其邻接表与邻接多重表的差别在于——同一条边在两个表中的结点数量不同:
- 邻接表中,同一条边用两个结点表示
- 邻接多重表中,只用一个结点表示
三、存储结构
邻接多重表的存储结构中,同样需要定义两种结点类型:
#define MAXSIZE 5
typedef int Edge_ElemType; // 边信息数据类型
typedef int Vert_ElemType; // 顶点信息数据类型
typedef struct Edge_Node {int ivex; // 顶点i的编号int jvex; // 顶点j的编号struct Edge_Node* ilink, * jlink; // 依附于顶点i与顶点j的边Edge_ElemType info; // 边的信息
}ENode; // 边结点
typedef struct VertexNode {Vert_ElemType data; // 顶点信息ENode* firstedge; // 依附于顶点的第一条边的结点
}VNode; // 顶点结点
typedef struct Adjacency_Multilist {VNode vert_list[MAXSIZE]; // 顶点表int edge_num; // 边的数量int vert_num; // 顶点数量
}AMGraph; // 邻接多重表
当图中的边没有权值时,可以省略边结点中的info
域;
四、算法评价
邻接多重表的算法评价同样以邻接多重表的遍历进行评价;
4.1 时间复杂度
在邻接多重表中,遍历所有顶点就是遍历一个顺序表,对于顶点数为 ∣ V ∣ |V| ∣V∣ 的图,其时间复杂度为 O ( ∣ V ∣ ) O(|V|) O(∣V∣);
遍历所有边只需要将每一条边都遍历一次,对于边数为 ∣ E ∣ |E| ∣E∣ 的图,其时间复杂度为 ∣ E ∣ |E| ∣E∣;
整个图的遍历对应的时间复杂度为 T ( N ) = O ( ∣ V ∣ + ∣ E ∣ ) T(N) = O(|V| + |E|) T(N)=O(∣V∣+∣E∣);
4.2 空间复杂度
在邻接多重表中,对于顶点数为 ∣ V ∣ |V| ∣V∣ ,边数为 ∣ E ∣ |E| ∣E∣ 的图而言,其需要的空间复杂度为 T ( N ) = O ( ∣ V ∣ + ∣ E ∣ ) T(N) = O(|V| + |E|) T(N)=O(∣V∣+∣E∣);
五、四种存储方式的总结
下面我们会从五个维度来探讨这四种存储方式:
5.1 空间复杂度
在邻接矩阵中,对于结点数为 n n n 的图,不管是有向图还是无向图都需要申请 n 2 n^2 n2 的空间,因此其空间复杂度均为 n 2 n^2 n2 ;
在邻接表中,对于结点数为 ∣ V ∣ |V| ∣V∣ 和边数为 ∣ E ∣ |E| ∣E∣ 的图,在有向图和无向图中,其空间复杂度并不相同:
- 有向图中,需要申请 ∣ V ∣ |V| ∣V∣ 个结点空间和 ∣ E ∣ |E| ∣E∣ 个边空间,因此对应的空间复杂度为: O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(∣V∣+∣E∣);
- 无向图中,需要申请 ∣ V ∣ |V| ∣V∣ 个结点空间和 2 ∗ ∣ E ∣ 2 * |E| 2∗∣E∣ 个边空间,因此对应的空间复杂度为: O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V| + 2|E|) O(∣V∣+2∣E∣);
在十字链表中,对于结点数为 ∣ V ∣ |V| ∣V∣ 和边数为 ∣ E ∣ |E| ∣E∣ 的图,需要申请同等数量的结点空间和边空间,其对应的空间复杂度为: O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(∣V∣+∣E∣);
在邻接多重表中,对于结点数为 ∣ V ∣ |V| ∣V∣ 和边数为 ∣ E ∣ |E| ∣E∣ 的图,需要申请同等数量的结点空间和边空间,其对应的空间复杂度为: O ( ∣ V ∣ + ∣ E ∣ ) O(|V| + |E|) O(∣V∣+∣E∣);
5.2 找相邻边
在邻接矩阵中,当我们要查找一个顶点的相邻边时,我们只需要遍历该顶点对应的行或者列。在邻接矩阵中,行数与列数都是图的顶点数 ∣ V ∣ |V| ∣V∣ ,因此对应的时间复杂度为 O ( ∣ V ∣ ) O(|V|) O(∣V∣) ;
在邻接表中,当我们要查找一个顶点的相邻边时,对于有向图与无向图而言,其查找邻边的时间复杂度也是有所区别:
- 无向图中,邻接表查找邻边时,只需要遍历该结点所指向的边表即可
- 有向图中,邻接表查找邻边时,对于出度与入度的时间复杂度也是有区别:
- 出度:查找一个顶点的出度,只需要遍历该结点所指向的边表即可
- 入度:查找一个顶点的入度,需要遍历整个邻接表
在十字链表中,当我们要查找一个顶点的相邻边时,就是查找该顶点的出度与入度,这时只需要分别遍历该结点的出度表与入度表即可
在邻接多重表中,当我们要查找一个顶点的相邻边时,只需要遍历对应的结点所邻接的边表即可
5.3 删除边或结点
在邻接矩阵中:
- 当我们要删除一条边时,只需要修改对应边在矩阵中的值即可
- 当我们要删除一个顶点时,需要移动大量的数据
在邻接表中:
- 有向图:
- 删除边:只需要删除对应的边结点即可
- 删除顶点:需要删除与该结点相邻的所有边结点以及该顶点
- 无向图:
- 删除边:需要删除其依附的两个顶点所对应的边表中的边结点
- 删除顶点:需要删除与该结点相邻的所有边结点以及该顶点
在十字链表和邻接多重表中:
- 删除边:我们只需要删除其对应的边结点即可
- 删除顶点:需要删除与该顶点相邻的所有边结点以及该顶点信息
不难发现,在图中,当我们要删除一个顶点时,实际上就是需要查找该顶点相邻边并进行删除,因此其删除操作是基于查找操作实现;
5.4 适用于
邻接矩阵由于需要消耗大量的空间用于存储边,因此适用于存储稠密图;
在邻接表中,由于边表是通过链表实现,能够节省存储空间,因此对于稀疏图而言,更加适合用邻接表进行存储;
在十字链表中,只能够存储有向图
在邻接多重表中,只能够存储无向图
5.5 表示方式
邻接矩阵是由各个顶点组成的矩阵,因此,其表示方式是唯一的;
在邻接表、十字链表以及邻接多重表中,由于边表的信息是通过链表进行的存储,因此其边表的表示方式并不唯一;
六、图的基本操作
图的基本操作时独立于图的存储结构的。而对于不同的存储方式,操作算法的具体实现会有着不同的性能。在设计具体算法的实现时,应考虑采用何种存储方式的算法效率会更高。
图的基本操作主要包括:
Adjacent(G, x, y)
: 判断图G是否存在边<x, y>
或(x, y)
;Neighbors(G, x)
: 列出图G中与结点x邻接的边InsertVertex(G, x)
: 在图G中插入顶点xDeleteVertex(G, x)
: 在图G中删除顶点xAddEdge(G, x, y)
: 若无向边(x, y)
或有向边<x, y>
不存在,则向图G中添加改边RemoveEdge(G, x, y)
: 若无向边(x, y)
或有向边<x, y>
存在,则从图G中删除该边FirstNeighbors(G, x)
: 求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1NextNeighbors(G, x, y)
: 假设图G中顶点 y 是顶点 x 的一个邻接点,返回除 y 外顶点 x 的下一个邻接点的顶点号,若 y 是 x 的最后一个邻接点,则返回-1Get_edge_value(G, x, y)
: 获取图G中边(x, y)
或<x, y>
对应的权值Set_edge_value(G, x, y, v)
: 设置图G中边(x, y)
或<x, y>
对应的权值
此外,还有图的遍历算法:按照某种方式访问图中的每个顶点,且仅访问一次。图的遍历算法有两种:
- 深度优先遍历(Depth-First-Search, DFS)
- 广度优先遍历(Breadth-First-Search, BFS)
具体内容会在下一个篇章中进行介绍。
结语
邻接多重表以“单边双链”的革新设计,将无向图的存储效率推向新高度——空间占用减半、删边操作跃升至O(1),完美解决了邻接表的冗余与低效痛点。
从邻接矩阵的刚性布局到链式结构的动态灵动,每一种存储方案都是空间与时间的精妙权衡,而邻接多重表无疑是高频删边场景的无向图终极答案。
但存储结构只是图算法的起点,真正的挑战在于如何基于这些结构实现高效操作。下一篇将深入图的广度优先遍历(BFS),解析其在邻接矩阵、邻接表及邻接多重表中的性能差异,并揭秘如何通过存储优化让BFS在千万级节点图中依然游刃有余!
🔍 本文是否为你拨开了图存储的迷雾?
👍 点赞支持原创深度干货,让技术洞察传播更远!
📁 收藏构建你的图论知识库,开发实战随时查阅。
🔄 转发至技术社区,与同行探讨存储选型与算法优化。
💬 评论区留下你的疑问:你在BFS实现中遇到过哪些性能瓶颈?我们共同拆解!
🔔 关注追踪更新,《图的广度优先遍历:从理论到超大规模实战》即将上线!
🚀 技术进阶之路,我们并肩前行!
相关文章:
【数据结构】图论存储结构深度解析:邻接多重表如何实现无向图O(1)删边?邻接矩阵/链表/十字链对比
邻接多重表 导读一、有向图的存储结构二、邻接多重表三、存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、四种存储方式的总结5.1 空间复杂度5.2 找相邻边5.3 删除边或结点5.4 适用于5.5 表示方式 六、图的基本操作结语 导读 大家好,很高兴又和大家见面啦&a…...
【AlphaFold2】Feature extraction:提取特征,为模型输入做准备|Datapipeline讲解
博主简介:努力学习的22级计算机科学与技术本科生一枚🌸博主主页: Yaoyao2024往期回顾:【深度学习】多头注意力机制的实现|pytorch每日一言🌼: 学习成绩只是表象,而学习能力才是伴随一身的结果🌺…...
Android 实现一个隐私弹窗
效果图如下: 1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数 2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来 res/layout/dialog_privacy_policy.xml 文件 <?xml version"1.0" encoding"utf-8"?&…...
第三方软件测试报告如何凭借独立公正与专业权威发挥关键作用?
在软件项目里,第三方软件测试报告起着极为关键的作用。第三方有着中立客观的立场。第三方具备专业能力。凭借这些,第三方能为软件质量评估提供可靠依据。下面要从不同方面介绍第三方软件测试报告。 独立公正性 第三方测试机构与软件开发方、使用方不存…...
QT控件 参考Qt的PIMPL设计模式实现使用QWidget控件绘制3D饼状图表和3D柱状图表,使用QChartView绘制圆柱体图表
整体绘制效果就是:Qt 实现3维饼状图 中的内容, 只不过我借鉴了Qt的PIMPL模式重新封装了整个实现过程 实现效果展示 目录导读 实现效果展示前言绘制3D饼状图表PIMPL模式设计类具体实现计算圆弧中心判断点是否在某个扇区中在私有类中绘制绘制3D柱状图表PIMPL模式设计类具体实现绘…...
Android Q允许低内存启用系统弹窗
如果SYSTEM_ALERT_WINDOW权限可用,则返回true。 *从Q开始,在低ram手机上禁用SYSTEM_ALERT_WINDOW。 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/Utils.java public static boolean isSystemAlertWindowEnabled(Co…...
Leetcode 3532. Path Existence Queries in a Graph I
Leetcode 3532. Path Existence Queries in a Graph I 1. 解题思路2. 代码实现 题目链接:3532. Path Existence Queries in a Graph I 1. 解题思路 这一题算是一个比较典型的DSU的题目,我们就是不断地根据前后节点的距离将其进行聚类,然后…...
AI Agent Protocols:现状、挑战与未来展望
一、引言 在当今人工智能飞速发展的时代,大语言模型(LLMs)的进步使得LLM智能体在各个行业得到了广泛的应用,如客户服务、内容生成、数据分析和医疗保健等领域。 然而,随着越来越多的LLM智能体被部署,一个…...
自动化立库/AGV物流仿真详细步骤
以下是一种可以在预算和周期内实现自动化立库及AGV 方案仿真分析的方法: 一、工具选择 软件工具FlexSim:这是一款流行的离散事件仿真软件。它具有直观的图形用户界面,通过简单的拖拽操作就可以构建自动化立库和 AGV 的模型。其内置的丰富的…...
【题解-Acwing】872. 最大公约数
题目:872. 最大公约数 题目描述 给定 n 对正整数 ai,bi,请你求出每对数的最大公约数。 输入 第一行包含整数 n。 接下来 n 行,每行包含一个整数对 ai,bi。 输出 输出共 n 行,每行输出一个整数对的最大公约数。 数据范围 1 ≤ n ≤ 105, 1 ≤ai, bi ≤ 2109 时空限…...
62.微服务保姆教程 (五) Seata--微服务分布式事务组件
Seata–微服务分布式事务组件 一、什么是分布式事务 1.什么是事务 事务指的是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。 2.本地事务 本地事务是指基于关系型数据库的事务,也称为传统事务。大多数场景…...
【算法练习】归并排序和归并分治
文章目录 1.归并排序1.1 递归版本1.2 非递归版本 2.归并分治2.1 计算数组的小和2.2 计算翻转对 1.归并排序 归并排序的核心步骤是: 拆分:将无序数组不断对半拆分成小块,直到每个小块只剩一个元素(自然有序)。 合并&a…...
从SOA到微服务:架构演进之路与实践示例
一、架构演进背景 在软件开发领域,架构风格随着业务需求和技术发展不断演进。从早期的单体架构,到面向服务架构(SOA),再到如今的微服务架构,每一次变革都是为了解决当时面临的核心问题。 二、SOA架构解析 2.1 SOA核心概念 SOA&…...
vue+cesium线流动纹理
index.vue页面 <!--线流动纹理实现--> <template><div id"mapContainerFirst"></div> </template> <script lang"ts" setup> import { init as initPolylineTrailLinkMaterialProperty } from ./PolylineTrailLinkM…...
深度学习·经典模型·SwinTransformer
SwinTransformer 主要创新点:移动窗口,基于窗口的注意力计算 Patch Embedding 下采样打包为Pacth:可以直接使用Conv2d 也可以先打包后使用embedding映射。 Patch Merging 类似池化的操作,压缩图片大小,同时通道数增多ÿ…...
在开发板上如何处理curl: (60) SSL certificate problem
目录 引言 问题解析 解决方法 跳过证书验证 采用证书认证 结语 引言 最近一直推荐学生们在课程实验中使用curl及其libcurl。curl 是一个强大的命令行工具,用于在命令行中进行数据传输。它支持多种协议,如 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。…...
Ansible 铸就 Linux 安全之盾(Ansible Builds Linux Security Shield)
Ansible 铸就 Linux 安全之盾:自动化基线检查与防护 在当今网络安全形势日益严峻的背景下,Linux 系统作为服务器和关键基础设施的核心,其安全防护显得尤为重要。Ansible 作为一款强大的自动化运维工具,能够帮助我们高效、可靠地实…...
字符串(格式化字符串字面值)进行输出
在 Python 中,print(fnew_obs:{new_obs}) 这种形式是使用 f 字符串(格式化字符串字面值) 进行输出,它可以打印 任何可转换为字符串的数据类型,并且支持在字符串中嵌入表达式。以下是详细说明: 1. 基本功能…...
微服务架构详解:从概念到实践
目录 前言1. 微服务架构概述1.1 什么是微服务?1.2 微服务的核心思想 2. 微服务的优势2.1 可扩展性2.2 高灵活性2.3 容错性和可靠性2.4 高效开发与部署 3. 微服务的挑战3.1 系统复杂性增加3.2 分布式事务和数据一致性3.3 部署和运维的复杂性 4. 微服务的实施与实践4.…...
激光驱鸟:以科技重构生态防护边界
技术原理 激光驱鸟装置的核心机制基于鸟类视觉系统特性。其发射的绿色激光束(波长通常为532纳米)处于鸟类视网膜敏感光谱范围内,当激光束在特定角度扫描时,会形成动态光斑干扰。鸟类视网膜中视锥细胞对绿色光的高敏感度使其产生应…...
【Python魔法方法(特殊方法)】
在 Python 中,许多运算符都可以进行重载,以下是一些常见运算符及其对应的魔法方法(特殊方法): 算术运算符 加法 :__add__ 用于定义对象相加的行为。例如,当你对两个自定义类的实例使用 运算符…...
centos上安装python的3.13版本
在 CentOS 上安装 Python 3.13(或其它自定义版本)最推荐的方法是通过源码编译安装,不会影响系统自带的 Python2/Python3 环境,也更灵活可控。 以下步骤适用于: ✅ CentOS 7 / 8 / 9 ✅ 安装 Python 3.13(…...
实习技能记录【4】-----消息分发中的观察者模型
观察者 观察者模式(Observer Pattern)是一种行为型设计模式,主要用于定义对象之间的一对多依赖关系,让多个观察者对象能够同时监听某个主题对象的状态变化,并在主题对象状态改变时自动通知所有观察者对象。 参考b站博…...
Linux 下编译BusyBox
一、linux下编译 1.拉取busybox源码 git clone https://github.com/mirror/busybox.git 内容如下 2.配置make,建议在linux下单独开一个终端执行 进入busybox源码目录,使用如下命令 make menuconfig 3.报错 解决办法: 安装ncurses sud…...
Linux《进程概念(中)》
在之前的Linux《进程概念(上)》当中我们已经了解了进程的基本概念以及如何去创建对应的子进程,那么接下来在本篇当中我们就继续来进程的学习,在本篇当中我们要学习到进程的状态、进程的优先级、进程切换、Linux真实的调度算法——…...
Linux Vim 使用 显示行号、替换、查找、多文件打开等骚操作
目录 简述 vim的三种模式 概述 转换方式 文本编辑 命令模式 插入(编辑)模式 底行模式 搜索关键字 显示行号 替换 多文件打开 简述 vi编辑器是Linux系统下标准的编辑器。 那么简单的理解,就像是Windows下的记事本。 补充&a…...
AimRT 从零到一:官方示例精讲 —— 三、Executor示例.md
Executor示例 官方仓库:executor 配置文件(configuration_executor.yaml) 依据官方示例项目结构自行编写YAML配置文件: # 基础信息 base_info:project_name: Logger # 项目名称build_mode_tags: ["EXAMPLE", &quo…...
只把夜莺监控当作告警来使用:一种轻量化的运维实践
只把夜莺监控当作告警来使用:一种轻量化的运维实践 在现代的 IT 运维体系中,监控和告警是两个经常被一同提及的概念。然而,在实际工作中,很多团队对监控系统的需求并不一定全面覆盖指标采集、可视化展示、告警触发等功能…...
按键精灵安卓ios辅助工具脚本:实用的文件插件(lua开源)
亮点:此lua插件可再android和ios上通用 1、获取文件的属性 2、改变当前的工作路径为dirpath 3、获取当前的工作路径 4、创建文件夹,支持多级创建 5、删除文件夹 6、递归遍历文件夹 7、设置文件的访问时间和修改时间 函数原型:lfs.Attribute(…...
水库现代化建设指南-水库运管矩阵管理系统建设方案
政策背景 2023年8月24日,水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出,在全面推进水库工程标准化管理的基础上,强化数字赋能,加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理,完…...
若依后台管理系统-v3.8.8-登录模块--个人笔记
各位编程爱好者们,你们好!今天让我们来聊聊若依系统在登录模块的一些业务逻辑,以及本人的一些简介和心得,那么废话不多说,让我们现在开始吧。 以下展示的这段代码,正是若依在业务层对应的登录代码…...
Flip PDF Plus Corp7.7.22电子书制作软件
flip pdf plus corporate7.7.22中文版由FlipBuilder官方出品的一款企业级的翻页电子书制作软件,拥有丰富的模板,主题和动画场景,每本书最大页数1000页,每本书的最大大小1GB,即可以帮助企业用户制作好丰富的电子书籍。 …...
公路安全知识竞赛主持稿串词
合 :尊敬的各位领导、各位来宾 、各位选手 : 大家上午 好! 男 :安全就是生命,安全就是效益,安全是一切工作的重中之重!安全生产只有满分,没有及格。只有安全生产这个环节不出差错,我…...
vscode 配置qt
工具:vscode、qttools、qtconfigure Search Mode改成基于cmake的。 # 在项目中指定Qt的路径 set(Qt5_DIR "/home/jp/qt-everywhere-src-5.12.9/arm-qt/lib/cmake/Qt5") # 用于指定 Qt5 的安装路径 find_package(Qt5 REQUIRED COMPONENTS Widgets)这样就…...
Node.js 事件循环和线程池任务完整指南
在 Node.js 的运行体系中,事件循环和线程池是保障其高效异步处理能力的核心组件。事件循环负责调度各类异步任务的执行顺序,而线程池则承担着处理 CPU 密集型及部分特定 I/O 任务的工作。接下来,我们将结合图示,详细剖析两者的工作…...
Java之BigDecimal
BigDecimal 是 Java 中用于高精度计算的类,特别适合需要精确十进制运算的场景,如金融计算、货币运算、概率计算等。 为什么需要 BigDecimal类 解决浮点数精度问题:float 和 double 使用二进制浮点运算,无法精确表示某些十进制小数…...
Qt5与现代OpenGL学习(四)X轴方向旋转60度
把上面两张图像放到D盘1文件夹内: shader.h #ifndef SHADER_H #define SHADER_H#include <QDebug> #include <QOpenGLShader> #include <QOpenGLShaderProgram> #include <QString>class Shader { public:Shader(const QString& verte…...
基于LVS+Keepalived+NFS的高可用负载均衡集群部署
目录 项目功能 2 项目的部署 2.1 部署环境介绍 2.2 项目的拓扑结构 2.3 项目环境调试 2.4 项目的部署 2.4.1 安装软件; 2.4.2 NFS服务器配置 2.4.3 Web节点配置 2.5 项目功能的验证 2.6 项目对应服务使用的日志 项目功能 负载均衡功能 实现原理:基于LVS(D…...
人工智能数学基础(四):线性代数
线性代数是人工智能领域的核心数学工具之一,广泛应用于数据表示、模型训练和算法优化等多个环节。本文将系统梳理线性代数的关键知识点,并结合 Python 实例,助力读者轻松掌握这一重要学科。资源绑定附上完整资源供读者参考学习! …...
基于C++的IOT网关和平台1:github项目ctGateway
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
LeetCode 2962.统计最大元素出现至少 K 次的子数组:滑动窗口
【LetMeFly】2962.统计最大元素出现至少 K 次的子数组:滑动窗口 力扣题目链接:https://leetcode.cn/problems/count-subarrays-where-max-element-appears-at-least-k-times/ 给你一个整数数组 nums 和一个 正整数 k 。 请你统计有多少满足 「 nums 中…...
Nginx反向代理的负载均衡配置
Nginx 负载均衡详解 在互联网应用中,随着网站访问量的不断攀升,服务器的服务模式也需要进行相应升级。诸如分离数据库服务器、将图片作为单独服务等操作,这些都属于简单的数据负载均衡,其目的是将压力分散到不同机器上。而来自 We…...
案例速成GO+Socket,个人笔记
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 文章目录 简单知识了解实现一个TCP 服务器与客户端(聊天室&#x…...
篮球足球体育球员综合资讯网站模板
采用帝国CMS7.5新版核心。栏目和内容模板超多变换。后台操作简单,安全可靠,性能稳定。整站浏览效果高端大气,可以帮助你快速建立一个适合自己的软件下载类型的站点! 演示地址:https://www.tmuban.com/store/620.html …...
HTTP(超文本传输协议)全面总结
HTTP(HyperText Transfer Protocol,超文本传输协议)是万维网(World Wide Web)应用中的基础协议,用于客户端与服务器之间的数据传输。随着互联网技术的发展,HTTP协议也经历了多个版本的更新&…...
OpenCV 图形API(72)图像与通道拼接函数-----根据指定的方式翻转图像(GMat)函数 flip()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 翻转一个2D矩阵,围绕垂直轴、水平轴或同时围绕两个轴。 该函数以三种不同的方式之一翻转矩阵(行和列的索引是从0开始的&a…...
【报错问题】 macOS 的安全策略(Gatekeeper)阻止了未签名的原生模块(bcrypt_lib.node)加载
这个错误是由于 macOS 的安全策略(Gatekeeper)阻止了未签名的原生模块(bcrypt_lib.node)加载 导致的。以下是具体解决方案: 1. 临时允许加载未签名模块(推荐先尝试) 在终端运行以下命令&#x…...
keep-alive具体使用方法
什么是 Keep-Alive <keep-alive> 是 Vue.js 提供的一个内置组件,用于缓存动态组件实例,从而避免重复渲染已加载过的组件。它的主要功能是在切换组件时保留状态和 DOM 结构,提升性能。 工作原理 <keep-alive> 的核心在于维护一个…...
【C++11】包装器:function与bind
前言: 上文我们学了C11中一个新的表达式:Lambda表达式。Lambda表达式可以在函数内部定义,其本质是仿函数【C11】Lambda表达式-CSDN博客 本文我们来学习C11的下一个新语法:包装器 function function的定义为: templat…...
Educational Codeforces Round 178 div2(题解ABCDE)
A. Three Decks #1.由于最后三个数会相等,提前算出来和,%3判断,再判前两个数是否大于 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #…...