当前位置: 首页 > news >正文

c++ 数据结构:图

图是一种重要的非线性数据结构,用于表示对象及其关系。它广泛应用于社交网络、交通网络、任务调度、导航等领域。

图的基本概念

图的定义: 图由 顶点(Vertex)边(Edge) 组成,记为 G=(V,E),其中:

  • V 是顶点的集合。
  • E 是边的集合,每条边连接两个顶点。

顶点和边的属性

  • 顶点(Vertex):也称节点,表示数据项。
  • 边(Edge):连接两个顶点,表示它们之间的关系。
  • 度(Degree):
    • 入度(In-Degree):指向某个顶点的边的数量。
    • 出度(Out-Degree):从某个顶点发出的边的数量。

图的分类

  • 无向图(Undirected Graph):边没有方向,表示双向关系。
  • 有向图(Directed Graph):边有方向,表示单向关系。
  • 加权图(Weighted Graph):边带有权重(如距离、费用)。
  • 稀疏图(Sparse Graph):边的数量远少于顶点的平方。
  • 稠密图(Dense Graph):边的数量接近顶点数的平方。
  • 连通图(Connected Graph):任意两顶点之间有路径相连。
  • 无环图(Acyclic Graph):没有环路的图。

特殊图

  • 树(Tree):无环、连通、且具有 n个顶点和 n−1 条边。
  • 完全图(Complete Graph):每对顶点之间都有一条边。
  • 二分图(Bipartite Graph):顶点集可分为两个互不相交的子集,且边只连接不同子集的顶点。

图的存储表示

邻接矩阵

概念

  • 使用二维数组表示图,适合稠密图。

  • 实现方式:如果有边 (u,v),则adj[u] [v] = 1;否则为0;

  • 优点

    • 快速查找是否存在边,时间复杂度 O(1)。
  • 缺点

    • 空间复杂度高,为 O(V^2)。

邻接矩阵表示无向图

#include <iostream>
#include <vector>using namespace std;class Graph {
private:int vertices;vector<vector<int>> adjMatrix;public:Graph(int V) : vertices(V), adjMatrix(V, vector<int>(V, 0)) {}void addEdge(int u, int v) {adjMatrix[u][v] = 1;adjMatrix[v][u] = 1; // 无向图}void printMatrix() {for (const auto& row : adjMatrix) {for (int val : row) {cout << val << " ";}cout << endl;}}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 3);cout << "Adjacency Matrix:" << endl;g.printMatrix();return 0;
}

邻接表

概念

  • 使用链表或向量表示每个顶点的邻接点,适合稀疏图。

  • 实现方式:每个顶点存储其所有邻接顶点。

  • 优点

    • 节省空间,适合稀疏图,空间复杂度 O(V+E)。
  • 缺点

    • 查找边是否存在需要 O(邻接点数量)O(\text{邻接点数量})O(邻接点数量)。

邻接表表示无向图

#include <iostream>
#include <vector>using namespace std;class Graph {
private:int vertices;vector<vector<int>> adjList;public:Graph(int V) : vertices(V), adjList(V) {}void addEdge(int u, int v) {adjList[u].push_back(v);adjList[v].push_back(u); // 无向图}void printList() {for (int i = 0; i < vertices; ++i) {cout << "Vertex " << i << ":";for (int neighbor : adjList[i]) {cout << " " << neighbor;}cout << endl;}}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 3);cout << "Adjacency List:" << endl;g.printList();return 0;
}

图的遍历

图的遍历是对图中所有顶点进行访问,常用方法有 深度优先搜索(DFS)广度优先搜索(BFS)

深度优先搜索(DFS)

  • 类似树的先序遍历,沿着一条路径尽可能深地搜索。

  • 使用递归或栈实现。

  • 时间复杂度:O(V+E)。

#include <iostream>
#include <vector>using namespace std;class Graph {
private:int vertices;vector<vector<int>> adjList;vector<bool> visited;public:Graph(int V) : vertices(V), adjList(V), visited(V, false) {}void addEdge(int u, int v) {adjList[u].push_back(v);adjList[v].push_back(u); // 无向图}void DFS(int start) {visited[start] = true;cout << start << " ";for (int neighbor : adjList[start]) {if (!visited[neighbor]) {DFS(neighbor);}}}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 3);cout << "DFS Traversal starting from vertex 0:" << endl;g.DFS(0);return 0;
}

广度优先搜索(BFS)

  • 类似树的层序遍历,从起点逐层访问邻接点。

  • 使用队列实现。

  • 时间复杂度:O(V+E)。

#include <iostream>
#include <vector>
#include <queue>using namespace std;class Graph {
private:int vertices;vector<vector<int>> adjList;public:Graph(int V) : vertices(V), adjList(V) {}void addEdge(int u, int v) {adjList[u].push_back(v);adjList[v].push_back(u); // 无向图}void BFS(int start) {vector<bool> visited(vertices, false);queue<int> q;visited[start] = true;q.push(start);while (!q.empty()) {int current = q.front();q.pop();cout << current << " ";for (int neighbor : adjList[current]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 3);cout << "BFS Traversal starting from vertex 0:" << endl;g.BFS(0);return 0;
}

典型算法

最短路径算法

Dijkstra 算法

适用于无负权图。

  • 使用一个优先队列(最小堆)存储顶点和其当前最短路径距离。
  • 从源点出发,逐步松弛每个相邻顶点的距离。
  • 更新优先队列中的顶点距离。
  • 直到处理完所有顶点。
  • 复杂度
    • 时间复杂度为 O((V+E)log⁡V),其中 V 是顶点数,E 是边数。
    • 空间复杂度为 O(V+E)。
#include <iostream>
#include <vector>
#include <queue>
#include <climits>using namespace std;// 用于表示图中的边
struct Edge {int target; // 边的目标顶点int weight; // 边的权重
};// 比较函数,用于优先队列(按距离升序排列)
struct Compare {bool operator()(pair<int, int> a, pair<int, int> b) {return a.second > b.second;}
};class Graph {
private:int vertices; // 顶点数量vector<vector<Edge>> adjList; // 邻接表public:Graph(int V) : vertices(V), adjList(V) {}// 添加边void addEdge(int u, int v, int weight) {adjList[u].push_back({v, weight});adjList[v].push_back({u, weight}); // 无向图}// Dijkstra 算法void dijkstra(int source) {// 存储从源点到每个顶点的最短距离,初始为无穷大vector<int> distance(vertices, INT_MAX);distance[source] = 0;// 优先队列,用于选择当前距离最小的顶点priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq;pq.push({source, 0});// 遍历优先队列while (!pq.empty()) {int current = pq.top().first;  // 当前顶点int currentDist = pq.top().second; // 当前顶点的距离pq.pop();// 遍历当前顶点的邻接点for (const Edge& edge : adjList[current]) {int neighbor = edge.target;int weight = edge.weight;// 如果找到更短的路径,更新距离if (currentDist + weight < distance[neighbor]) {distance[neighbor] = currentDist + weight;pq.push({neighbor, distance[neighbor]});}}}// 输出结果cout << "Shortest distances from source " << source << ":" << endl;for (int i = 0; i < vertices; ++i) {cout << "Vertex " << i << " -> Distance: " << distance[i] << endl;}}
};int main() {// 创建一个包含5个顶点的图Graph g(5);// 添加边g.addEdge(0, 1, 2);g.addEdge(0, 3, 6);g.addEdge(1, 2, 3);g.addEdge(1, 3, 8);g.addEdge(1, 4, 5);g.addEdge(2, 4, 7);g.addEdge(3, 4, 9);// 调用 Dijkstra 算法g.dijkstra(0);return 0;
}

Bellman-Ford 算法

处理有负权图。

  • 对每条边进行 V−1次松弛操作(顶点数 - 1)。

    • 每次松弛尝试更新从源点到目标点的最短路径距离。
  • 在第 V 次迭代检查是否仍有边可以被松弛:

    • 如果可以,则图中存在负权环。
  • 时间复杂度

    • O(V⋅E),其中 V 是顶点数,E 是边数。
    • 适合稀疏图。
  • 空间复杂度

    • O(V)用于存储距离数组。
#include <iostream>
#include <vector>
#include <climits>using namespace std;// 用于表示图中的边
struct Edge {int src;    // 边的起点int dest;   // 边的终点int weight; // 边的权重
};class Graph {
private:int vertices; // 顶点数量vector<Edge> edges; // 边的集合public:Graph(int V) : vertices(V) {}// 添加边void addEdge(int u, int v, int weight) {edges.push_back({u, v, weight});}// Bellman-Ford 算法void bellmanFord(int source) {vector<int> distance(vertices, INT_MAX); // 初始化距离为无穷大distance[source] = 0; // 源点到自身的距离为0// 松弛所有边 V-1 次for (int i = 1; i <= vertices - 1; ++i) {for (const Edge& edge : edges) {if (distance[edge.src] != INT_MAX && distance[edge.src] + edge.weight < distance[edge.dest]) {distance[edge.dest] = distance[edge.src] + edge.weight;}}}// 检测负权环for (const Edge& edge : edges) {if (distance[edge.src] != INT_MAX && distance[edge.src] + edge.weight < distance[edge.dest]) {cout << "Graph contains a negative weight cycle!" << endl;return;}}// 输出结果cout << "Shortest distances from source " << source << ":" << endl;for (int i = 0; i < vertices; ++i) {cout << "Vertex " << i << " -> Distance: ";if (distance[i] == INT_MAX)cout << "INF";elsecout << distance[i];cout << endl;}}
};int main() {// 创建一个包含5个顶点的图Graph g(5);// 添加边 (u, v, weight)g.addEdge(0, 1, -1);g.addEdge(0, 2, 4);g.addEdge(1, 2, 3);g.addEdge(1, 3, 2);g.addEdge(1, 4, 2);g.addEdge(3, 2, 5);g.addEdge(3, 1, 1);g.addEdge(4, 3, -3);// 调用 Bellman-Ford 算法g.bellmanFord(0);return 0;
}

最小生成树

Prim 算法

  • 从任意一个顶点开始,将其加入最小生成树集合。

  • 找到连接当前生成树集合与其余顶点的权重最小的边,将该边和顶点加入最小生成树。

  • 重复上述步骤,直到所有顶点都加入生成树。

  • 时间复杂度

    • 使用优先队列优化后,时间复杂度为 O(Elog⁡V),其中 V是顶点数,E 是边数。
  • 空间复杂度

    • O(V+E),用于存储图的邻接表和辅助数组。
#include <iostream>
#include <vector>
#include <climits>
#include <queue>using namespace std;// 用于表示图中的边
struct Edge {int target; // 目标顶点int weight; // 边的权重
};// 比较函数,用于优先队列(按边权重升序排列)
struct Compare {bool operator()(pair<int, int> a, pair<int, int> b) {return a.second > b.second;}
};class Graph {
private:int vertices; // 顶点数量vector<vector<Edge>> adjList; // 邻接表public:Graph(int V) : vertices(V), adjList(V) {}// 添加边void addEdge(int u, int v, int weight) {adjList[u].push_back({v, weight});adjList[v].push_back({u, weight}); // 无向图}// Prim 算法void primMST() {vector<bool> inMST(vertices, false);  // 标记顶点是否在 MST 中vector<int> key(vertices, INT_MAX);  // 每个顶点的当前最小边权重vector<int> parent(vertices, -1);    // 记录生成树中的父节点priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq;// 从第一个顶点开始key[0] = 0;pq.push({0, 0}); // {顶点, 权重}while (!pq.empty()) {int u = pq.top().first; // 当前顶点pq.pop();if (inMST[u]) continue; // 如果顶点已在 MST 中,跳过inMST[u] = true;// 遍历当前顶点的邻接点for (const Edge& edge : adjList[u]) {int v = edge.target;int weight = edge.weight;// 如果顶点 v 不在 MST 中,且权重更小,更新if (!inMST[v] && weight < key[v]) {key[v] = weight;parent[v] = u;pq.push({v, weight});}}}// 输出最小生成树cout << "Edge   Weight" << endl;for (int i = 1; i < vertices; ++i) {cout << parent[i] << " - " << i << "    " << key[i] << endl;}}
};int main() {// 创建一个包含5个顶点的图Graph g(5);// 添加边g.addEdge(0, 1, 2);g.addEdge(0, 3, 6);g.addEdge(1, 2, 3);g.addEdge(1, 3, 8);g.addEdge(1, 4, 5);g.addEdge(2, 4, 7);g.addEdge(3, 4, 9);// 调用 Prim 算法cout << "Minimum Spanning Tree (MST):" << endl;g.primMST();return 0;
}

Kruskal 算法

计算最小生成树(MST),适用于边集稠密的图。与 Prim 算法不同,Kruskal 算法是基于边的,按照边的权重从小到大排序后逐步选择边来构建生成树。

  • 边排序:将图中所有边按权重从小到大排序。

  • 构建最小生成树:从权重最小的边开始,逐一检查边是否会形成环(使用并查集来判断)。

  • 并查集(Union-Find):通过并查集数据结构来管理顶点,判断两顶点是否在同一个连通分量中,以防止形成环。

  • 时间复杂度

    • 排序边的时间复杂度是 O(Elog⁡E),其中 E是边数。
    • 每次查找和合并操作的时间复杂度是 O(α(V)),其中 α是反阿克曼函数,几乎是常数级的。
    • 总体时间复杂度为 O(Elog⁡E),由于 E 通常大于 V,因此常常简化为 O(Elog⁡V)。
  • 空间复杂度

    • O(V+E),用于存储图的邻接表、边集合和并查集。
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 用于表示边
struct Edge {int u, v, weight; // 边的两个端点和边的权重bool operator<(const Edge& other) const {return weight < other.weight; // 按边的权重升序排列}
};// 并查集(Union-Find)数据结构
class UnionFind {
private:vector<int> parent, rank;public:UnionFind(int n) {parent.resize(n);rank.resize(n, 0);for (int i = 0; i < n; ++i) {parent[i] = i; // 初始化时每个顶点是自己的父节点}}// 查找操作,带路径压缩int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]); // 路径压缩}return parent[x];}// 合并操作,按秩合并void unionSets(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {// 按秩合并,保持树的平衡if (rank[rootX] > rank[rootY]) {parent[rootY] = rootX;} else if (rank[rootX] < rank[rootY]) {parent[rootX] = rootY;} else {parent[rootY] = rootX;rank[rootX]++;}}}
};class Graph {
private:int vertices; // 顶点数量vector<Edge> edges; // 边集合public:Graph(int V) : vertices(V) {}// 添加边void addEdge(int u, int v, int weight) {edges.push_back({u, v, weight});}// Kruskal 算法void kruskalMST() {// 1. 将所有边按照权重排序sort(edges.begin(), edges.end());// 2. 初始化并查集UnionFind uf(vertices);vector<Edge> mst; // 最小生成树// 3. 逐条边检查for (const Edge& edge : edges) {int u = edge.u;int v = edge.v;// 4. 如果当前边的两个端点不在同一连通分量中,则加入 MSTif (uf.find(u) != uf.find(v)) {uf.unionSets(u, v); // 合并两个顶点的连通分量mst.push_back(edge); // 将当前边加入最小生成树}}// 5. 输出最小生成树cout << "Minimum Spanning Tree (MST):" << endl;int mstWeight = 0;for (const Edge& edge : mst) {cout << edge.u << " - " << edge.v << " : " << edge.weight << endl;mstWeight += edge.weight;}cout << "Total Weight of MST: " << mstWeight << endl;}
};int main() {// 创建一个包含5个顶点的图Graph g(5);// 添加边 (u, v, weight)g.addEdge(0, 1, 2);g.addEdge(0, 3, 6);g.addEdge(1, 2, 3);g.addEdge(1, 3, 8);g.addEdge(1, 4, 5);g.addEdge(2, 4, 7);g.addEdge(3, 4, 9);// 调用 Kruskal 算法g.kruskalMST();return 0;
}

拓扑排序

参考:https://blog.csdn.net/www_dong/article/details/144122257

相关文章:

c++ 数据结构:图

图是一种重要的非线性数据结构&#xff0c;用于表示对象及其关系。它广泛应用于社交网络、交通网络、任务调度、导航等领域。 图的基本概念 图的定义&#xff1a; 图由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成&#xff0c;记为 G(V,E)&a…...

SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试

Mock概念 Mock叫做模拟对象&#xff0c;即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为&#xff08;例如返回值或抛出异常&#xff09;&#xff0c;从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖&#xff0c;spring-boot-start…...

十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能 文章目录 十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能1. Druid 的基本介绍2. 准备工作&#xff1a;3. Druid 监控功能 3.1 Druid 监控功能 —— Web 关联监控3.2 Druid 监控功能 —— …...

Python办公—DataMatrix二维条码制作

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...

Linux:软硬链接

目录 一、概念 软链接 硬链接 二、原理 硬链接 软链接 三、使用场景 硬链接 软链接 一、概念 软链接 在当前目录下&#xff0c;有一个普通文件a.txt。 ln -s a.txt a_soft.link结论&#xff1a; 软链接是一个文件。 观察inode_id&#xff0c;发现软链接有着独立…...

[笔记] Windows 上 Git 安装详细教程:从零开始,附带每个选项解析

Git 是目前最流行的分布式版本控制系统之一&#xff0c;广泛应用于软件开发和项目管理中。对于 Windows 用户来说&#xff0c;正确安装和配置 Git 是开始使用 Git 的第一步。本文提供一份详细的指南&#xff0c;帮助你在 Windows 系统上顺利安装 Git&#xff0c;并解释每个安装…...

23种设计模式之策略模式

目录 1. 简介2. 代码2.1 Strategy &#xff08;策略接口&#xff09;2.2 AddStrategy &#xff08;具体策略类&#xff09;2.3 SubStrategy &#xff08;具体策略类&#xff09;2.4 MultiplyStrategy &#xff08;具体策略类&#xff09;2.5 Operation &#xff08;上下文类&am…...

总篇:Python3+Request+Pytest+Allure+Jenkins接口自动化框架设计思路

1、技术选型 Python3 Python 是一种广泛使用的高级编程语言,具有简洁、易读、易维护的特点。 Python 拥有丰富的第三方库,可以方便地进行接口测试的开发。 Request Request 是一个强大的 HTTP 库,用于发送 HTTP 请求和处理响应。 Request 支持多种 HTTP 方法,如 GET、P…...

【QML】release版本bug,信号的参数无法获取

1. 现象 问题 QML程序在debug编译模式下程序可以正常运行&#xff0c;但是release版本下报错&#xff1a;ReferenceError: para is not defined版本 Qt creator 10.0.2Qt_5_15_2_MinGW 平台 win 10 2. 解决方法 暂时没有找到好的解决办法&#xff0c;只能规避规避方法 //问…...

Javaweb 前端 ajax

作用&#xff1a;和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义&#xff0c;请求后端之后&#xff0c;后端把数据放在回调 点了清空之后&#xff0c;还要查询全部 await等待请求执行完之后&#xff0c;接收这个结果 代码…...

汽车EEA架构:发展历程

1.发展历程的基本逻辑 汽车电子电气的发展历程中&#xff0c;其使用的基本逻辑是IPO(Input-Processing-Output)模型&#xff0c;如下图1所示&#xff1a; 图 1 那什么是IPO模型了&#xff1f;我们从控制器的原理入手解释IPO模型,控制器的主要用途如下&#xff1a; 根据给定的逻…...

几个Linux系统安装体验: 统信服务器系统

本文介绍统信服务器系统&#xff08;UOS&#xff09;的安装。 下载 下载地址&#xff1a; https://www.chinauos.com/resource/download-server 本文下载的文件名称为uos-server-20-1070e-amd64.iso。 安装 本次实践仅是做测试体验&#xff0c;因此在pc上使用虚拟机vmware…...

用二维图像渲染3D场景视频

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…...

ChatGPT 最新推出的 Pro 订阅计划,具备哪些能力 ?

OpenAI 最近推出了 ChatGPT Pro&#xff0c;这是一个每月收费 200 美元的高级订阅计划&#xff0c;旨在为用户提供对 OpenAI 最先进模型和功能的高级访问。 以下是 ChatGPT Pro 的主要功能和能力&#xff1a; 高级模型访问&#xff1a; o1 模型&#xff1a;包括 o1 和 o1 Pro…...

如何在 IntelliJ IDEA 中为 Spring Boot 应用实现热部署

文章目录 1. 引言2. 准备工作3. 添加必要的依赖4. 配置 IntelliJ IDEA4.1 启用自动编译4.2 开启热部署策略 5. 测试热部署6. 高级技巧7. 注意事项8. 总结 随着现代开发工具的进步&#xff0c;开发者们越来越重视提高生产力的特性。对于 Java 开发者来说&#xff0c;能够在不重启…...

NLP与LLM的工程化实践与学习思考 - 写在开头

NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 写在开头 0 开头的开头 0 开头的开头 24年因为一些工作原因&#xff0c;短暂在NLP领域遨游了半年。这半年对我的影响蛮大&#xff0c;一来是因为此前从没接触过这个方向学到新东西挺开心的&#xff0c;二来是在工程化实践…...

Redis(一)

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…...

RocketMq源码-broker(五)

一、RocketMq存储设计 RocketMQ 主要存储的文件包括Commitlog 文件、ConsumeQueue 文件、IndexFile。RocketMQ 将所有主题的消息存储在同一文件&#xff0c;确保消息发送时顺序写文件&#xff0c;尽最大的能力确保消息发送的高性能与高吞吐量。 但由于一般的消息中间件是基于消…...

【Linux】文件描述符fd

1.前置预备 文件 内容 属性访问文件之前&#xff0c;都必须先打开他 #include<stdio.h> int main() { FILE* fpfopen("log.txt","w"); if(fpNULL) { perror("fopen"); return 1; } fclose(fp); return 0…...

mysql之事务

MySQL的事务隔离特性指的是多个并发事务之间相互隔离的程度&#xff0c;以保证数据的一致性和并发性。MySQL支持四个隔离级别&#xff0c;分别是读未提交&#xff08;Read Uncommitted&#xff09;、读已提交&#xff08;Read Committed&#xff09;、可重复读&#xff08;Repe…...

python插入mysql数据

# 插入与上一篇变化不大,只是需要进行确认操作. 增加确认操作的方法有两种&#xff08;假设类对象为a&#xff09;: 1.在连接时传入一个参数:autocommitTrue aConnection&#xff08; host"localhost", port3306, user"root", password"自己的密码…...

C语言面试题/笔试题/高频面试题

一、C&#xff1a; 1.static和const的作用优缺点 限制作用域&#xff1a; static声明中使用全局变量、函数 &#xff0c;仅当前文件内可用&#xff0c;其他文件不能引用 static修饰的局部变量只能在本函数中使用. 延长生命周期: static修饰的变量生命周期为整个程序 存放位置&a…...

rust websocket Echo server高性能服务器开发

最近在学习websocket时,一直没有发现好的websocket server工具来调试,于是就自己做了一个websocket server用来学习和调试。因为rust性能遥遥领先,所以就采用了rust来搭建服务器。废话不多说直接上代码main.rs: use tokio::net::TcpListener; use tokio_tungstenite::tung…...

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…...

ViT学习笔记(二) Patch+Position Embedding阶段的详细推演与理解

我认为讲得最好的一个文章&#xff1a;Vision Transformer详解-CSDN博客 有很多文章&#xff0c;自己并没有完全正确理解。 我的笔记&#xff0c;以ViT的标准应用为例&#xff1a; • 输入图像&#xff1a;输入图像的尺寸是224x224&#xff0c;且是RGB图像&#xff0c;因此输…...

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞&#xff1a;Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时&#xff0c;需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤&#xff0c;为单节…...

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图&#xff08;部分&#xff09; 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案&#xff0c;无需下载和安装任何APP&#xff0c…...

ASP.NET Core8.0学习笔记(二十五)——EF Core Include导航数据加载之预加载与过滤

一、导航属性数据加载 1.在EF Core中可以使用导航属性来加载相关实体。 2.加载实体的三种方式&#xff1a; (1)预先加载&#xff1a;直接在查询主体时就把对应的依赖实体查出来&#xff08;作为初始查询的一部分&#xff09; (2)显式加载&#xff1a;使用代码指示稍后显式的从…...

【RK3562J开发笔记】MCP2518FD外部CAN-FD控制器的调试方法

“SPI转CAN-FD”是嵌入式开发领域的常用方法&#xff0c;它极大地促进了不同通信接口之间的无缝连接&#xff0c;并显著降低了系统设计的复杂性。飞凌嵌入式依托瑞芯微RK3562J处理器打造的OK3562J-C开发板因为内置了SPI转CAN-FD驱动&#xff0c;从而原生支持这一功能。该开发板…...

docker安装Emqx并使用自签名证书开启 SSL/TLS 连接

docker安装Emqx并使用自签名证书开启 SSL/TLS 连接 一、获取自签名证书1、创建openssl.cnf文件2、生成证书自签名证书 二、docker安装EMQX1、初始化目录2、加载镜像文件并挂载相应的文件目录3、启动docker容器4、EMQX加载自签名证书 三、客户端MQTTX连接测试四、Springboot整合…...

AI驱动的低代码平台:解密背后的算法与架构创新

引言 在如今的数字化浪潮中&#xff0c;企业对软件的需求正以前所未有的速度增长。传统的开发方式由于开发周期长、成本高&#xff0c;已逐渐无法满足市场的快速变化。而低代码平台的出现&#xff0c;使得开发者和业务人员能够以极简的方式快速构建应用。然而&#xff0c;随着企…...

ruoyi的excel批量导入

最简单方式 若依的官方文档提供了教程&#xff0c;可以按照起前后端的教学&#xff0c;进行代码编写 前段 组件 <!-- 导入对话框 --><el-dialogtitle"导入数据"v-model"openImport"width"500px"append-to-body><el-uploadref&quo…...

大数据-244 离线数仓 - 电商核心交易 ODS层 数据库结构 数据加载 DataX

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…...

Spring Security

一.权限控制 1.1 认证和授权概念 问题1&#xff1a;在生产环境下我们如果不登录后台系统就可以完成这 些功能操作吗&#xff1f; 答案显然是否定的&#xff0c;要操作这些功能必须首先登录到系统才可 以。 问题2&#xff1a;是不是所有用户&#xff0c;只要登录成功就都可以操…...

OpenAI 正式发布 o1 完整版

OpenAI 在 o1 模型完整版&#xff0c;该模型相较于之前的 o1-preview 版本在智能能力上有所提升&#xff0c;特别是在编程能力方面&#xff0c;并且能够根据问题的难度智能调节响应速度。此外还新增了图像识别功能&#xff0c;但目前仍然不支持网页浏览、文件上传等功能 o1 模…...

Ubuntu22.04搭建LAMP环境(linux服务器学习笔记)

目录 引言&#xff1a; 一、系统更新 二、安装搭建Apache2 1.你可以通过以下命令安装它&#xff1a; 2.查看Apache2版本 3.查看Apache2运行状态 4.浏览器访问 三、安装搭建MySQL 1.安装MySQL 2.查看MySQL 版本 3.安全配置MySQL 3.1是否设置密码&#xff1f;(按y|Y表…...

C#与PLC通讯时,数据读取和写入浮点数,字节转换问题(ModbusTCP)

在与PLC进行通讯时&#xff0c;会发现一个问题&#xff0c;浮点数1.2接收过来后&#xff0c;居然变成了两个16位的整数。 经过一系列的分析&#xff0c;这是因为在PLC存储浮点数时32位&#xff0c;我们接收过来的数据会变成两个16位的高低字节&#xff0c;而且我们进行下发数据…...

synchronized的特性

1.互斥 对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。 就比如synchronized修饰代码块时&#xff0c;一个线程进入该代码块就会进行“加锁”。 退出代码块时会进行“解锁”。 当其他线程想要访问被加锁的代码块时&#xff0c;就会阻塞等待。 阻塞等待…...

NLP与LLM的工程化实践与学习思考 - 说说知识图谱

NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 说说知识图谱 0 真的就是先说说1 为什么知识图谱什么是知识图谱&#xff1f;基于图的数据结构&#xff1f;基于数据结构的图&#xff1f;知识图谱的技术要点两个技术维度&#xff1a;知识、图七个技术要点&#xff1a;表示…...

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解&#xff0c;PHP判断是否为数组 PHP函数介绍&#xff1a;in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…...

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上&#xff0c;但颜色错误的问题。问题最终查明是因为使用了一个调整工具&#xff0c;导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...

Android 15 行为变更:所有应用

Android 15 平台包含一些可能会影响您的应用的行为变更。以下行为变更将影响在 Android 15 上运行的所有应用&#xff0c;无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用&#xff0c;然后根据需要进行修改&#xff0c;以适当地支持这些变更。 此外&#xff0c;请…...

基于pytorch的深度学习基础4——损失函数和优化器

四&#xff0e;损失函数和优化器 4.1 均值初始化 为减轻梯度消失和梯度爆炸&#xff0c;选择合适的权重初值。 十种初始化方法 Initialization Methods 1. Xavie r均匀分布 2. Xavie r正态分布 4. Kaiming正态分布 5. 均匀分布 6. 正态分布 7. 常数分布 8. 正交矩阵初…...

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…...

Webpack Source Map 配置详解与优化策略

前言 Source Map 是前端开发和调试中的核心工具之一&#xff0c;它可以显著提高我们在代码调试和错误追踪方面的效率。随着 JavaScript 应用越来越复杂&#xff0c;代码打包和优化成为必然&#xff0c;而这一过程会使得调试变得异常困难。Source Map 的出现&#xff0c;为我们…...

el-tree组件刷新指定id的节点数据

示例 封装一个可以刷新多个指定id的节点数据。 <template><el-tree ref"treeRef"></el-tree> </template><script lang"ts" setup> const treeRef ref()function refreshTreeById(nodeIds: number[]) {nodeIds.forEach((…...

深入 Java 基础 XML:高级特性与最佳实践

在上一篇文章中&#xff0c;我们对 Java 基础 XML 有了一个初步的认识&#xff0c;了解了 XML 的基本结构以及在 Java 中常见的解析方式。今天&#xff0c;我们将进一步深入探讨 Java 与 XML 的结合&#xff0c;包括一些高级特性和最佳实践。 一、XML 命名空间 在复杂的 XML …...

aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3

aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容&#xff1a; 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合&#xff0c…...

Ubuntu与Centos系统有何区别?

Ubuntu和CentOS都是基于Linux内核的操作系统&#xff0c;但它们在设计理念、使用场景和技术实现上有显著的区别。以下是详细的对比&#xff1a; 1. 基础和发行版本 Ubuntu&#xff1a; 基于Debian&#xff0c;使用.deb包管理系统。包含两个主要版本&#xff1a; LTS&#xff…...

【OpenDRIVE_Python】使用python脚本读取txt指定内容,输出OpenDRIVE数据中对应的信息

示例代码说明&#xff1a; 读取txt指定内容如地物id&#xff0c;输出OpenDRIVE数据中的对应地物id和名称name信息为xml文件 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取OpenDRIVE文件路径 xml_filepath…...