26考研——图_图的代码实操(6)
408答疑
文章目录
- 五、图的代码实操
- 图的存储
- 邻接矩阵
- 结构定义
- 初始化
- 插入顶点
- 获取顶点位置
- 在顶点 v1 和 v2 之间插入边
- 获取第一个邻接顶点
- 获取下一个邻接顶点
- 显示图
- 邻接表
- 结构定义
- 初始化图
- 插入顶点
- 获取顶点位置
- 在顶点 v1 和 v2 之间插入边
- 获取第一个邻接顶点
- 获取下一个邻接顶点
- 显示图
- 图的遍历
- 深度优先遍历
- 算法思想
- 算法步骤
- 算法特点
- 邻接矩阵
- 邻接表
- 广度优先遍历
- 算法思想
- 邻接矩阵
- 邻接表
- 图的应用
- BFS算法求解单源最短路径问题
- 拓扑排序
- 六、参考资料
- 鲍鱼科技课件
- 26王道考研书
五、图的代码实操
图的存储
邻接矩阵
结构定义
typedef struct GraphMtx {int numV; // 顶点个数int numE; // 边的条数ElemType vList[MAX_VERTEX_SIZE]; // 顶点空间int edge[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE]; // 边的矩阵
} GraphMtx;
初始化
- 初始化图的顶点数和边数为 0,并将邻接矩阵的所有元素设置为 0。
void initGraph(GraphMtx *g) {g->numV = 0;g->numE = 0;for (int i = 0; i < MAX_VERTEX_SIZE; ++i) {for (int j = 0; j < MAX_VERTEX_SIZE; ++j)g->edge[i][j] = 0;}
}
插入顶点
- 在图中插入一个新顶点,如果顶点数超过最大值则不插入。
void insertVertex(GraphMtx *g, ElemType vertex) {if (g->numV >= MAX_VERTEX_SIZE)return;g->vList[g->numV] = vertex;g->numV++;
}
获取顶点位置
- 返回顶点在顶点列表中的位置,如果不存在则返回 -1。
int getPosVertex(GraphMtx *g, ElemType vertex) {for (int i = 0; i < g->numV; ++i) {if (g->vList[i] == vertex)return i;}return -1; // 没有要查找的顶点
}
在顶点 v1 和 v2 之间插入边
- 在图中插入一条从顶点 vertex1 到顶点 vertex2 的边。
void insertEdge(GraphMtx *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);// 插入v1->v2边g->edge[v1][v2] = 1;// 若是无向图,则插入v2->v1边//g->edge[v2][v1] = 1;g->numE++;
}
获取第一个邻接顶点
- 获取给定顶点的第一个邻接顶点。
int getFirstNeighbor(GraphMtx *g, ElemType vertex) {int v = getPosVertex(g, vertex);if (v == -1)return -1; // 没有邻接顶点for (int j = 0; j < g->numV; ++j) {if (g->edge[v][j] == 1)return j; // 返回邻接顶点}return -1; // 没有邻接顶点
}
获取下一个邻接顶点
- 获取给定顶点的下一个邻接顶点。
int getNextNeighbor(GraphMtx *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);if (v1 == -1 || v2 == -1)return -1;for (int j = v2 + 1; j < g->numV; ++j) {if (g->edge[v1][j] == 1)return j;}return -1;
}
显示图
- 显示图的邻接矩阵。
void showGraph(GraphMtx *g) {printf(" ");for (int i = 0; i < g->numV; ++i)printf(" %c", g->vList[i]);printf("\n");for (int i = 0; i < g->numV; ++i) {printf("%c ", g->vList[i]);for (int j = 0; j < g->numV; ++j) {printf("%d ", g->edge[i][j]);}printf("\n");}
}
邻接表
结构定义
typedef struct Edge {int dest; // 目标顶点的下标struct Edge *next; // 结点指针
} Edge;typedef struct Vertex {ElemType data; // 顶点数据Edge *first; // 指向边的起始指针
} Vertex;typedef struct GraphLnk {int numV; // 顶点数int numE; // 边的条数Vertex nodeTable[MAX_VERTEX_SIZE];
} GraphLnk;
初始化图
- 初始化图的顶点数和边数为 0,并将邻接表的所有元素设置为 NULL。
void initGraph(GraphLnk *g) {g->numV = 0;g->numE = 0;for (int i = 0; i < MAX_VERTEX_SIZE; ++i)g->nodeTable[i].first = NULL;
}
插入顶点
- 在图中插入一个新顶点,如果顶点数超过最大值则不插入。
void insertVertex(GraphLnk *g, ElemType vertex) {if (g->numV >= MAX_VERTEX_SIZE)return;g->nodeTable[g->numV].data = vertex;g->numV++;
}
获取顶点位置
- 返回顶点在顶点列表中的位置,如果不存在则返回 -1。
int getPosVertex(GraphLnk *g, ElemType vertex) {for (int i = 0; i < g->numV; ++i) {if (g->nodeTable[i].data == vertex)return i;}return -1; // 没有要查找的顶点
}
在顶点 v1 和 v2 之间插入边
- 在图中插入一条从顶点 vertex1 到顶点 vertex2 的边。
void insertEdge(GraphLnk *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);// v1->v2Edge *e = (Edge*)malloc(sizeof(Edge));e->dest = v2;e->next = g->nodeTable[v1].first;g->nodeTable[v1].first = e;// 若是无向图,则插入v2->v1边//e = (Edge*)malloc(sizeof(Edge));//e->dest = v1;//e->next = g->nodeTable[v2].first;//g->nodeTable[v2].first = e;g->numE++;
}
获取第一个邻接顶点
- 获取给定顶点的第一个邻接顶点。
int getFirstNeighbor(GraphLnk *g, ElemType vertex) {int v = getPosVertex(g, vertex);if (v == -1)return -1; // 没有邻接顶点if (g->nodeTable[v].first != NULL)return g->nodeTable[v].first->dest;return -1; // 没有邻接顶点
}
获取下一个邻接顶点
- 获取给定顶点的下一个邻接顶点。
int getNextNeighbor(GraphLnk *g, ElemType vertex1, ElemType vertex2) {int v1 = getPosVertex(g, vertex1);int v2 = getPosVertex(g, vertex2);if (v1 == -1 || v2 == -1)return -1;Edge *p = g->nodeTable[v1].first;while (p->dest != v2)p = p->next;p = p->next;if (p != NULL)return p->dest;return -1;
}
显示图
- 显示图的邻接表。
void showGraph(GraphLnk *g) {for (int i = 0; i < g->numV; ++i) {printf("%d %c : ", i, g->nodeTable[i].data);Edge *p = g->nodeTable[i].first;while (p != NULL) {printf("%d->", p->dest);p = p->next;}printf("Nil.\n");}
}
图的遍历
深度优先遍历
算法思想
深度优先遍历(DFS)是一种用于遍历或搜索图或树的算法。该算法使用栈(显式或递归)来实现非递归约的遍历过程。算法从图中的某一顶点开始,沿着路径深入访问尽可能远的顶点,直到不能再深入为止,然后回溯并访问其他路径。
算法步骤
- 访问起始顶点:选择图中的某一顶点作为起始点,并标记为已访问。
- 访问邻接顶点:访问该顶点的所有未被访问的邻接顶点,对每个邻接顶点递归地调用DFS。
- 回溯:当当前路径无法继续深入时,回溯到最近的已访问顶点,检查是否有其他未访问的邻接顶点。
- 重复过程:重复上述过程,直到图中所有顶点都被访问。
算法特点
- DFS 相当于二叉树中的前序遍历。
- 使用临时空间来标记结点是否被访问过。
- 适用于图的连通性检测、拓扑排序等场景。
邻接矩阵
void DFS(GraphMtx *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1; // 标记顶点int w = getFirstNeighbor(g, vertex);while (w != -1) {if (!visit[w]) {DFS(g, g->vList[w]);}w = getNextNeighbor(g, g->vList[v], g->vList[w]); //(g, v1, v2)}
}
邻接表
void DFS(GraphLnk *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1; // 标记顶点int w = getFirstNeighbor(g, vertex);while (w != -1) {if (!visit[w]) {DFS(g, g->nodeTable[w].data);}w = getNextNeighbor(g, g->nodeTable[v].data, g->nodeTable[w].data); //(g, v1, v2)}
}
广度优先遍历
算法思想
-
初始化:
- 标记起始顶点为已访问。
- 将起始顶点入队。
-
遍历队列:当队列不为空时,执行以下操作。
- 从队列中取出一个顶点。
- 访问该顶点的所有未访问过的邻接顶点。
- 将这些邻接顶点标记为已访问,并加入队列。
-
重复步骤2,直到队列为空,即所有可达顶点都被访问。
邻接矩阵
void BFS(GraphMtx *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1;int Q[MAX_VERTEX_SIZE];int front = 0, rear = 0;// 入队Q[rear++] = v;while (front != rear) { // 队列不空v = Q[front++]; // 出队并保存顶点int w = getFirstNeighbor(g, g->vList[v]);while (w != -1) {if (!visit[w]) {printf("%c->", g->vList[w]);visit[w] = 1;Q[rear++] = w;}w = getNextNeighbor(g, g->vList[v], g->vList[w]);}}
}
邻接表
void BFS(GraphLnk *g, ElemType vertex) {printf("%c->", vertex);int v = getPosVertex(g, vertex);visit[v] = 1;int Q[MAX_VERTEX_SIZE];int front = 0, rear = 0;// 入队Q[rear++] = v;while (front != rear) { // 队列不空v = Q[front++]; // 出队并保存顶点int w = getFirstNeighbor(g, g->nodeTable[v].data);while (w != -1) {if (!visit[w]) {printf("%c->", g->nodeTable[w].data);visit[w] = 1;Q[rear++] = w;}w = getNextNeighbor(g, g->nodeTable[v].data, g->nodeTable[w].data);}}
}
图的应用
BFS算法求解单源最短路径问题
-
初始化:
- 设置所有顶点的最短路径长度为无穷大,起始顶点的距离为0。
- 标记起始顶点为已访问。
- 将起始顶点加入队列。
-
BFS遍历:当队列非空时,执行以下操作。
- 从队列中取出一个顶点。
- 遍历该顶点的所有未访问邻接顶点。
- 更新邻接顶点的最短路径长度。
- 标记邻接顶点为已访问。
- 将邻接顶点加入队列。
-
完成遍历:
- 重复步骤2,直到队列为空。
- 此时,数组
d
中存储的即为从起始顶点到所有可达顶点的最短路径长度。
void BFS_MIN_Distance(GraphMtx G, int u) {// d[i]表示从u到i结点的最短路径长度int d[MAX_VERTEX_SIZE]; int visited[MAX_VERTEX_SIZE]; // 访问标记数组Queue Q; // 定义队列Qfor (int i = 0; i < G.numV; ++i) {d[i] = ∞; // 初始化路径长度为无穷大visited[i] = FALSE; // 初始化所有顶点为未访问}d[u] = 0; // 起始顶点到自身的距离为0visited[u] = TRUE; // 标记起始顶点为已访问EnQueue(Q, u); // 将起始顶点入队while (!IsEmpty(Q)) { // BFS算法主过程int v;DeQueue(Q, v); // 队头元素v出队for (int w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w)) {if (!visited[w]) { // w为v的尚未访问的邻接顶点visited[w] = TRUE; // 标记为已访问d[w] = d[v] + G.edge[v][w]; // 路径长度加v到w的边的权重EnQueue(Q, w); // 顶点w入队}}}
}
拓扑排序
- 使用栈实现图的拓扑排序,输出顶点的拓扑序列。
void topSort(GraphMtx *g) {// 统计每一个顶点的入度for (int j = 0; j < g->numV; ++j) {for (int i = 0; i < g->numV; ++i) {if (g->edge[i][j] == 1)inDegree[j]++;}}// 定义一个栈ElemType stack[MAX_VERTEX_SIZE] = { 0 };int top = 0;// 把入度为0的顶点入栈for (int i = 0; i < g->numV; ++i) {if (inDegree[i] == 0) // 入度为0stack[top++] = i;}for (int i = 0; i < g->numV; ++i) { // 排序输出每一个顶点if (top == 0) {printf("图有回路.\n");return;}int v = stack[--top];printf("%c->", g->vList[v]);int w = getFirstNeighbor(g, g->vList[v]);while (w != -1) {if (--inDegree[w] == 0)stack[top++] = w;w = getNextNeighbor(g, g->vList[v], g->vList[w]);}}
}
六、参考资料
鲍鱼科技课件
b站免费王道课后题讲解: link
网课全程班: link
26王道考研书
相关文章:
26考研——图_图的代码实操(6)
408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…...
栈资源释放示例
import java.util.EmptyStackException; /** * 栈资源释放示例类 * 栈资源在编程中通常指两种概念:1) 内存中的调用栈空间(存储方法调用和局部变量),由系统自动管理 * 2) 自定义的栈数据结构(如链表实现的栈对象&…...
【Qt 01】cmake搭建Qt VS2019开发环境
文章目录 准备第一步:安装Qt5 库第二步:编写CMakeLists.txt第三步:编写批处理文件其他配置Qt VS Toolsqt 源码调试配置 疑问初始的.ui, .qrc文件如何生成? 准备 编码:vscode debug: vs2019 Qt vs Tools 插件 c包管理…...
余弦退火算法与学习率预热
余弦退火算法与学习率预热 总述: (1)标准余弦退火算法(Cosine Annealing)是通过单次的余弦曲线调整学习率,在一个周期内让学习率从一个最大值平滑下降η_max到最小值η_min,这种调整模式是非周…...
ref vs reactive,watch vs watchEffect的区别与使用场景
一、ref 与 reactive 的核心区别 使用场景 ref:处理基本数据类型;需要重新赋值对象(如从api获取新数据) reactive:处理复杂的嵌套对象或者数组,不需要整体替换,直接访问属性(避免频繁写.value&…...
SQLark SQL编辑器秘籍,编写高效SQL查询
SQLark 是一款功能强大的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,支持达梦、Oracle 和 MySQL 数据库。SQLark内置的 SQL 编辑器,基于语法解析,集成智能提示、实时语法检查及语法高亮等功能࿰…...
LLM之RAG实战(五十二)| 如何使用混合搜索优化RAG 检索
在RAG项目中,大模型生成的参考内容(专业术语称为块)来自前一步的检索,检索的内容在很大程度上直接决定了生成的效果,因此检索对于RAG项目至关重要,最常用的检索方法是关键字搜索和语义搜索。本文将分别介绍…...
如何基于ios部署Deep Seek?
在 iOS 上部署深度学习模型(如 DeepSeek 或其他自定义模型)通常需要将模型转换为 iOS 支持的格式(如 Core ML),并通过代码集成到应用中。以下是详细步骤: 1. 准备模型 模型训练 确保你的模型已训练完成&…...
spring security 使用的过滤器还是拦截器
spring security 使用的过滤器还是拦截器 Spring Security 是一个强大的安全框架,用于保护 Java 应用程序。它主要使用过滤器(Filters)来实现安全功能,而不是拦截器(Interceptors)。不过,它也提…...
新四化驱动,如何构建智能汽车的“全场景”可进化互联网络?
在智能化、电动化、网联化、共享化的时代浪潮中,汽车正从单纯的 “机械产品” 进化为先进的 “移动智能终端”。 在软件定义汽车(SDV)的崭新时代,每一次 OTA 升级的顺利完成、每一秒自动驾驶的精准决策、每一帧车载娱乐交互的流畅…...
Rust从入门到精通之进阶篇:17.宏编程基础
宏编程基础 宏是 Rust 中强大的元编程工具,允许你编写可以生成其他代码的代码。与函数不同,宏在编译时展开,可以实现更灵活的代码生成和重用模式。在本章中,我们将探索 Rust 的宏系统,包括声明宏和过程宏的基础知识。 宏与函数的区别 在深入宏编程之前,让我们先了解宏…...
MySQL基础语法
目录 一、数据定义语言(DDL) 1. 创建数据库 2. 删除数据库 3. 创建表 4. 删除表 5. 查看表结构 6. 修改表结构 二、数据操作语言(DML) 1. 插入数据 2. 更新数据 3. 删除数据 三、数据查询语言(DQLÿ…...
数据结构练习二习题
第七题: #include<bits/stdc.h> using namespace std;#define MaxSize 100 // 定义顺序表的最大长度typedef int ElemType; // 定义元素类型为inttypedef struct {ElemType data[MaxSize]; // 存储数据的数组int length; // 当前顺序表的长度…...
Flutter 中 GetX 的优缺点及常见问题解决方案
在 Flutter 生态中,GetX 凭借其轻量级、高效的特性,成为众多开发者青睐的状态管理与路由解决方案。然而,任何工具都有其适用场景与局限性。 一、GetX 的核心优势 1. 极简开发体验 GetX 通过响应式语法糖(如Rx和Obx)…...
Qt开发:QColorDialog的使用
文章目录 一、QColorDialog的基本介绍二、QColorDialog的基本用法三、完整示例 一、QColorDialog的基本介绍 QColorDialog 继承自 QDialog,用于让用户选择颜色。它可以以模态或非模态的方式运行,并支持 QColor 作为输入和输出。 二、QColorDialog的基本…...
【计算机网络编码与调制】
文章目录 一、前言二、编码与调制的基本概念1. 编码常见编码类型: 2. 调制常见调制类型: 三、常见编码技术1. NRZ编码(Non-Return to Zero)特点: 2. 曼彻斯特编码(Manchester)特点: …...
<数据集>手势识别数据集<目标检测>
数据集下载链接https://download.csdn.net/download/qq_53332949/90529961数据集格式:VOCYOLO格式 图片数量:10829张 标注数量(xml文件个数):10829 标注数量(txt文件个数):10829 标注类别数:26 标注类别名称&…...
魔法测试:用本地多模态大模型(Qwen2.5-VL)将PDF转为Markdown文档
安装咒语清单 📜 pip install -U vllm qwen-vl-utils pdf2image pip install githttps://github.com/huggingface/transformers accelerate(温馨提示:念咒前请检查你的魔法棒(Python环境)是否兼容~) 第一阶段:PDF变…...
【渗透测试】Fastjson 反序列化漏洞原理(二)
目录 反序列化漏洞结合 RMI 攻击详解一、RMI 和 JNDI 的基础知识(1) RMI 简介(2) JNDI 简介 二、漏洞利用的核心原理1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 加载并执行恶意代码 三、具体利用过程环境准备攻击步骤1. 构造恶意 JSON 数据2. 设置恶意 RMI 服务3. 部署恶意类…...
[c语言日寄MAX]深度解析:大小端字节序
【作者主页】siy2333 【专栏介绍】⌈c语言日寄MAX⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还…...
凝视型高光谱相机:钻石光谱分析研究与应用
钻石作为一种珍贵的宝石,其颜色和光谱特征一直是宝石学研究的重要方向。中达瑞和测试部样品科对六种不同颜色的钻石样品进行了高光谱成像测试,旨在分析它们在光谱下的差异和可分性。本文将详细介绍此次测试的过程、结果及其意义。 测试样品与设备 此次…...
2.基于多线程的TCP服务器实现
在我们预想中,服务器端应该能够同时与多个客户端建立连接并进行网络通信。然而,在之前的代码中,服务器实现只支持单一连接,因为在处理连接时,主线程会被accept()、read()或write()等方法阻塞,导致无法响应新…...
自动驾驶01 激光雷达原理
部分转载于 原文链接:https://blog.csdn.net/qq_45193988/article/details/143982588 1. 什么是激光雷达 激光雷达LiDAR的全称为Light Detection and Ranging 激光探测和测距。 激光雷达的工作原理:对红外光束Light Pluses发射、反射和接收来探测物体。…...
基础场景-------------------(5)重载和重写的区别
重写(Override) 从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继 承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列 表,返回…...
基于ssm的微博网站(全套)
进入信息时代以来,很多数据都需要配套软件协助处理,这样可以解决传统方式带来的管理困扰。比如耗时长,成本高,维护数据困难,数据易丢失等缺点。本次使用数据库工具MySQL和编程技术JSP开发的微博网站,可以实…...
Java并发编程从入门到实战:同步、异步、多线程核心原理全解析
《Java并发编程从入门到实战:同步、异步、多线程核心原理全解析》 一、多线程基础认知(从单核到多核的进化) 1.1 什么是线程? 线程是程序执行的最小单元,一个进程可以包含多个线程。例如浏览器同时下载文件࿰…...
《引流获客》总结
第一章 入门篇 理解爆款打法和引流打法的区别 爆款打法:刷播放量,制作“爆款”视频/文案。 引流打法:刷有效转化,不在意播放量,而注重有多少观众被引流成为客户,完成消费,即成交转化。 定理&…...
基于Python的机器学习入门指南
在当今数字化时代,机器学习(Machine Learning)已经成为科技领域中最热门的话题之一。它不仅改变了我们对数据的理解和处理方式,还在许多行业中得到了广泛应用,如金融、医疗、交通等。Python作为一门强大的编程语言&…...
【蓝桥杯每日一题】3.25
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x “OJ超时不是终点,是算法在提醒你该优化时间复杂度了!” 目录 3.25 差分数组 一、一维差分 题目链接: 题目描述: 解题思路:…...
Kubernetes高级应用之-重启策略
一、介绍+扩展应用(涉及的高级资源在后续会写出来) # Kubernetes Pod重启策略(RestartPolicy)全面解析 ## 一、重启策略的核心价值与重要性 在Kubernetes集群中,Pod重启策略(RestartPolicy&a…...
Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)
文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…...
Next.js 严重漏洞:攻击者可绕过中间件授权检查
Next.js React 框架近日披露了一个严重的安全漏洞,攻击者可在特定条件下利用该漏洞绕过授权检查。该漏洞被标记为 CVE-2025-29927,其 CVSS 评分为 9.1(满分 10.0)。 漏洞详情 Next.js 在公告中表示:“Next.js 使用内…...
气象可视化卫星云图的方式:方法与架构详解
气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…...
NLP高频面试题(十四)——DPO、PPO等强化学习训练方法介绍
强化学习(Reinforcement Learning,RL)近年来随着深度学习的快速发展而备受关注,特别是在游戏控制、自动驾驶、机器人控制及大语言模型训练等领域均有广泛应用。本文将重点介绍强化学习中的经典训练方法,包括PPO&#x…...
从 Neo4j 数据库中提取数据并绘制图谱
代码说明: 连接 Neo4j 数据库: 使用 py2neo.Graph 连接到 Neo4j 数据库。确保替换 uri、username 和 password 为你的实际配置。 Cypher 查询: 查询数据库中的节点和关系,限制返回的记录数(例如 LIMIT 100)…...
Android Compose 框架隐式动画之过渡动画深入剖析(二十六)
Android Compose 框架隐式动画之过渡动画深入剖析 一、引言 在移动应用开发领域,用户体验始终是至关重要的。动画效果作为提升用户体验的关键元素,能够为应用增添生动性和交互性。Android Compose 作为现代 Android UI 工具包,为开发者提供…...
esp32s3聊天机器人(三)
先放上最新的硬件图 添加了按钮、600毫安锂电池和充电板 关于 sherpa-onnx 语音生成的打断 按说明实现了一下,但是偶尔还是有问题,毕竟不是直接立刻打断生成 private int OnAudioData(nint samples, int n){//Console.WriteLine("OnAudioData n…...
超融合服务器是什么
超融合服务器的定义与背景 超融合服务器(Hyperconverged Infrastructure, HCI)是一种通过软件定义技术,将计算、存储、网络和虚拟化功能整合到单一硬件平台中的IT基础设施解决方案。其核心目标是通过资源的高度集成和统一管理,简…...
Rust从入门到精通之精通篇:22.Unsafe Rust 详解
Unsafe Rust 详解 在 Rust 的设计哲学中,安全性是核心原则之一。Rust 的所有权系统、借用检查器和类型系统共同保证了内存安全和线程安全。然而,有些底层操作无法通过 Rust 的安全检查机制进行验证,这就是 unsafe Rust 存在的原因。在本章中,我们将深入探讨 unsafe Rust,…...
如何设计系统扩展性以应对业务增长
要设计具备良好扩展性的系统以应对业务增长,关键在于采用分布式架构、实现服务的松耦合、保证数据库的水平扩展能力、使用缓存和CDN优化性能、做好持续监控与自动化运维。其中,服务的松耦合尤为重要。松耦合意味着系统中各服务之间的依赖关系较弱&#x…...
Python基于Django的小区监控图像拼接系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
ElasticSearch快速入门--实现分词搜索
分词题目搜索 使用Elasticsearch实现题目数据的存储和分词搜索,需要将数据库的数据同步到 Elasticsearch。 ElasticSearch入门 ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,用Java开发并且是当前最流行的开源的…...
解读探寻数字影像新路径:树莓集团现状最新进展
树莓集团在数字影像领域展现出强劲的发展势头,其核心战略在于构建完整的数字产业生态链。 产业园建设与运营 全国布局: 树莓集团已在全国范围内建设并运营多个国际数字影像产业园,旨在打造区域性的数字产业高地。 成都案例: 在成…...
数据治理之数据仓库
本文主要阐述了数据仓库在大数据平台项目中的地位和重要性,对目前市场上数据仓库主流设计进行分析说明,讲述了通用数据仓库设计上所应考虑的因素。 数据仓库介绍 数据仓库是一个过程而不是一个项目;数据仓库是一个环境,而不是一件产品。数据仓库提供用户用于决策支持的当前…...
自由学习记录(48)
When the material of an object disappears, the light and shadow also disappear (synchronized) Tiling And Offset 显示的是四分之一前面的,不是中间的四分之一块, 准确的还是跟着视频学, ,AI一些回答会散发一种“奇怪的错味…...
zynq7020 最小ps环境速通
1 简介 环境: 硬件 野火 zynq 皓月 xc7z020clg400-1 软件: vivado2020.2 vitis2020.2 petalinux2020.2 搭建 ps 的最小环境,跑裸机 helloworld 测试 uart 和 ddr,跑 linux 系统. 2 ps 环境搭建 2.1 uart 2.1 ddr 2.1 删除 pl 接口,包括 pl 时钟,pl 时钟复位,axi_m. 具体略…...
Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现
文章目录 Modbus RTU到Modbus TCP透传技术实现1. 透传技术概述1.1 透传基本原理- 协议帧格式转换- 地址映射与管理- 通信时序适配- 错误检测与处理 2. 透传网关硬件架构2.1 典型硬件结构- 微控制器/处理器(ARM、STM32等)- RS-485/RS-232收发器- 以太网控制器(如W5500)- 电源管理…...
【SOC 芯片设计 DFT 学习专栏 -- IDDQ 测试 与 Burn-In 测试】
文章目录 IDDQ 测试与 Burn-In 测试IDDQ 测试工作原理测试过程优点局限性示例 2. Burn-In 测试工作原理测试过程优点局限性示例 总结对比 IDDQ 测试和 Burn-in 测试: IDDQ 测试与 Burn-In 测试 本文将详细介绍 DFT 中 IDDQ测试 和 burn-in测试模式 IDDQ 测试 IDD…...
Rust从入门到精通之进阶篇:19.Rust 生态系统
Rust 生态系统 Rust 拥有一个丰富而活跃的生态系统,提供了各种库和框架来支持不同领域的开发。在本章中,我们将探索 Rust 生态系统中的主要组件,了解常用的库和工具,以及如何在项目中有效地使用它们。 Rust 包管理:Cargo 和 crates.io Cargo 回顾 Cargo 是 Rust 的构建…...
【HarmonyOS Next】三天撸一个BLE调试精灵
【HarmonyOS Next】三天撸一个BLE调试精灵 一、功能介绍 BLE调试精灵APP属于工具类APP,在用户使用的过程中,负责调试BLE设备从机端,比如蓝牙耳机、低功耗设备、带有BLE的空调等设备,可以在页面中清晰看到设备的厂商,…...