Dijkstra 算法入门笔记 (适用于算法竞赛初学者) - C++ 代码版
目录
- 算法是做什么的?
- 核心思想:贪就完事了!
- 算法前提:不能有负权边!
- 需要哪些工具?(数据结构)
- 算法具体步骤
- 关键操作:松弛 (Relaxation)
- 两种实现方式 (C++ 代码)
- 朴素版 Dijkstra (O(V^2))
- 堆优化版 Dijkstra (O(E log V))【竞赛常用】
- 复杂度分析
- 注意事项与常见问题
- 练习建议
- 总结
1. 算法是做什么的?
Dijkstra (迪杰斯特拉) 算法主要用于解决 单源最短路径 问题。
- 单源 (Single Source): 指的是从图中的 一个 指定的起始点(源点)出发。
- 最短路径 (Shortest Path): 找到从这个源点到图中 所有 其他可达点的路径中,权重(或距离、成本)之和最小的那条路径。
- 图 (Graph): 算法作用于带权重的有向图或无向图。
简单说: 给你一张地图(图),上面有各个地点(顶点)以及地点之间的道路长度(边的权重),Dijkstra 算法能帮你快速找到从你的出发点到其他所有地方的最短路线。
2. 核心思想:贪就完事了!
Dijkstra 算法的核心思想是 贪心策略。
- 初始化: 选定一个源点
s
。我们用一个数组dist[v]
记录源点s
到顶点v
的 当前已知最短距离。一开始,dist[s] = 0
,其他所有dist[v] = ∞
(表示暂时不可达)。 - 迭代: 每次从 还没有确定最终最短路径 的顶点中,选择一个
dist
值最小的顶点u
。 - 确定与扩展: 这个
u
的dist[u]
值就是源点s
到u
的 最终最短距离 (因为没有负权边,后面不可能有更短的路绕回来了)。然后,我们利用u
来 更新 (或者叫 松弛) 与它相邻的顶点的dist
值。如果通过u
到达其邻居v
的路径 (dist[u] + weight(u, v)
) 比当前已知的dist[v]
更短,就更新dist[v]
。 - 重复: 重复步骤 2 和 3,直到所有顶点都被选中(或者所有可达顶点都被选中)。
形象比喻: 想象源点像一个火源开始燃烧,火势(最短路径)总是先蔓延到最近的地方,然后从这些已燃烧的地方继续向外蔓延。
3. 算法前提:不能有负权边!
极其重要: Dijkstra 算法 不能 正确处理带有 负权重边 的图。
- 原因: 算法的贪心策略基于一个假设:一旦一个顶点的最短路径被确定,它就是最终的了。但如果存在负权边,后面可能通过一个负权边“绕回来”,使得已确定“最短路径”的点有了更短的路径,这就破坏了贪心选择的基础。
- 如果遇到负权边怎么办? 需要使用其他算法,例如 Bellman-Ford 算法或 SPFA 算法 (SPFA 在某些情况下可能被特殊数据卡住,Bellman-Ford 更稳健但效率较低)。
4. 需要哪些工具?(数据结构)
实现 Dijkstra 算法通常需要以下数据结构:
- 图的表示:
- 邻接矩阵 (Adjacency Matrix):
g[i][j]
存储从顶点i
到顶点j
的边的权重。简单直观,但对于稀疏图(边数远小于点数的平方)空间浪费大。 - 邻接表 (Adjacency List):
vector<pair<int, int>> adj[N]
或类似的结构,adj[u]
存储从u
出发的所有边,每条边表示为{v, weight}
(到达顶点v
,权重为weight
)。竞赛中最常用,节省空间。
- 邻接矩阵 (Adjacency Matrix):
- 距离数组
dist[N]
:dist[i]
存储源点到顶点i
的当前最短距离。初始化为无穷大(一个足够大的数,如0x3f3f3f3f
在 C++ 中常用,防止加法溢出),源点dist[source] = 0
。 注意使用long long
防止溢出! - 标记数组
visited[N]
或st[N]
(状态 state):visited[i]
标记顶点i
是否已经找到了最终的最短路径(即是否已经被选为上文步骤 2 中的u
)。初始化为false
。 (朴素版必需,堆优化版可选) - (堆优化版需要) 优先队列 (Priority Queue): 用于快速找到
dist
值最小的未访问顶点。通常存储自定义结构体State{node, dist}
或pair<long long, int>
,表示{distance, vertex}
。注意 C++std::priority_queue
默认是大顶堆,我们需要小顶堆(存储负距离或者自定义比较器,或使用std::greater
)。
5. 算法具体步骤
以源点 s
为例:
- 初始化:
dist
数组所有元素设为无穷大 (LINF
)。dist[s] = 0
。visited
数组所有元素设为false
(如果使用)。- (堆优化版) 将
{s, 0}
(节点, 距离) 压入优先队列pq
。
- 循环 (朴素版 V 次,堆优化版直到队列为空):
- a. 找到下一个顶点
u
:- 朴素版: 在所有
visited[i] == false
的顶点i
中,找到dist[i]
最小的那个顶点u
。 - 堆优化版: 从优先队列
pq
中取出堆顶元素{u, d}
(当前距离d
最小的顶点u
)。检查d > dist[u]
,如果是,则跳过 (旧状态)。
- 朴素版: 在所有
- b. 标记 (可选): 将
visited[u]
设为true
(朴素版必需)。 - c. 松弛
u
的邻居: 遍历所有从u
出发的边(u, v)
,其权重为w
:- 如果
dist[u] + w < dist[v]
,那么:- 更新
dist[v] = dist[u] + w
。 - (堆优化版) 将新的、更短的距离信息
{v, dist[v]}
压入优先队列pq
。
- 更新
- 如果
- a. 找到下一个顶点
- 结束: 循环结束后,
dist
数组中就存储了源点s
到所有可达顶点的最短距离。如果某个dist[i]
仍然是LINF
,表示从s
无法到达i
。
6. 关键操作:松弛 (Relaxation)
松弛是 Dijkstra 算法的核心步骤之一。它的意思是:对于边 (u, v)
,我们检查是否可以通过顶点 u
来 改善 (缩短) 到达顶点 v
的路径。
// 假设 u 已经被确定了最短路径 dist[u] (或至少是当前最优)
// v 是 u 的一个邻居,边的权重是 weight
// dist 是存储最短距离估计值的数组 (类型通常为 long long)
// LINF 是表示无穷大的常量if (dist[u] != LINF && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight; // 更新 v 的最短距离估计值// 如果是堆优化版本,还需要将更新后的状态放入优先队列// pq.push({v, dist[v]}); // (伪代码,具体看下方实现)
}
7. 两种实现方式 (C++ 代码)
(假设已包含头文件 <vector>
, <queue>
, <cstring>
, <functional>
, 并定义了 LINF
, MAXN
以及 Edge
结构体,并且 adj
, dist
, visited
, V
是可访问的全局变量或通过参数传递)
// --- 需要的前置定义 (示例) ---
#include <vector>
#include <queue>
#include <cstring>
#include <functional> // for std::greaterconst long long LINF = 0x3f3f3f3f3f3f3f3fLL;
const int MAXN = 100005;struct Edge {int to;int weight;
};struct State {int node;long long dist;bool operator>(const State& other) const {return dist > other.dist;}
};extern std::vector<Edge> adj[MAXN]; // 邻接表 (需在外部定义和填充)
extern long long dist[MAXN]; // 距离数组 (需在外部定义)
extern bool visited[MAXN]; // 访问标记 (需在外部定义)
extern int V; // 顶点数 (需在外部定义)
// --- 前置定义结束 ---
朴素版 Dijkstra (O(V^2))
// --- 朴素版 Dijkstra 函数 ---
void dijkstra_simple(int start_node) {// 1. 初始化for (int i = 1; i <= V; ++i) { // 假设顶点从 1 到 Vdist[i] = LINF;visited[i] = false;}dist[start_node] = 0;// 2. 循环 V 次for (int i = 0; i < V; ++i) {int u = -1;long long min_dist = LINF;// a. 找到 dist 最小的未访问顶点 ufor (int j = 1; j <= V; ++j) {if (!visited[j] && dist[j] < min_dist) {min_dist = dist[j];u = j;}}// 如果找不到或剩下的点不可达if (u == -1) {break;}// b. 标记 u 为已访问visited[u] = true;// c. 松弛 u 的邻居for (const auto& edge : adj[u]) {int v = edge.to;int weight = edge.weight;// 确保 dist[u] 不是 LINF 且 v 未访问if (dist[u] != LINF && !visited[v] && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;}}}
}
堆优化版 Dijkstra (O(E log V))【竞赛常用】
// --- 堆优化版 Dijkstra 函数 ---
void dijkstra_heap(int start_node) {// 1. 初始化for (int i = 1; i <= V; ++i) { // 假设顶点从 1 到 Vdist[i] = LINF;// visited 在堆优化版中通常不是必需的,但有时可用于小幅优化// visited[i] = false;}dist[start_node] = 0;// 优先队列,存储 {节点, 距离},按距离从小到大排序 (小顶堆)std::priority_queue<State, std::vector<State>, std::greater<State>> pq;pq.push({start_node, 0});// 2. 主循环while (!pq.empty()) {// a. 取出当前距离最小的状态State current = pq.top();pq.pop();int u = current.node;long long current_dist = current.dist;// **核心优化**: 如果取出的距离比记录的还大,说明是旧状态,跳过if (current_dist > dist[u]) {continue;}// 如果使用 visited 数组优化:// if (visited[u]) continue;// visited[u] = true;// b. 松弛 u 的邻居for (const auto& edge : adj[u]) {int v = edge.to;int weight = edge.weight;// 确保 dist[u] 不是 LINFif (dist[u] != LINF && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;// 将更新后的、更短的距离信息加入优先队列pq.push({v, dist[v]});}}}
}
注意 long long
: 在竞赛中,路径长度之和很容易超过 int
的最大值 (约 2 * 10^9)。强烈建议使用 long long
来存储 dist
数组,避免溢出导致错误。
8. 复杂度分析
- 朴素版:
- 时间复杂度:O(V^2)。
- 空间复杂度:O(V + E) (邻接表) 或 O(V^2) (邻接矩阵)。
- 堆优化版:
- 时间复杂度:O(E log V)。
- 空间复杂度:O(V + E)。
竞赛中,由于 V 通常较大,E 相对 V^2 较小,堆优化版的 O(E log V) 是必须掌握的。
9. 注意事项与常见问题
- 负权边: 再次强调,Dijkstra 不能处理负权边。
- 图的表示: 竞赛通常用邻接表。
- 重边和自环: Dijkstra 能正确处理。
- 图不连通:
dist
数组中不可达顶点的距离将保持为LINF
。 - INF 的选择:
LINF
要足够大,0x3f3f3f3f3f3f3f3fLL
是常用的long long
型无穷大。 - 起点和终点编号: 注意题目是从 0 还是 1 开始。代码示例假设从 1 开始。
- 路径记录: 如果需要输出路径,可在松弛时记录前驱节点
parent[v] = u
。
10. 练习建议
- 模板题: 洛谷 P3371 (朴素/堆), P4779 (堆优化), AcWing 849 (朴素), 850 (堆优化)。
- 练习平台: 洛谷, AcWing, LeetCode, 牛客网。
- 做题策略: 先实现模板,再做变化题。
11. 总结
Dijkstra 算法是图论中基础且重要的单源最短路径算法,核心是 贪心 和 松弛。掌握 堆优化版本 对于算法竞赛至关重要。理解原理、前提、细节,并通过 C++ 代码实践和做题来巩固。
相关文章:
Dijkstra 算法入门笔记 (适用于算法竞赛初学者) - C++ 代码版
目录 算法是做什么的?核心思想:贪就完事了!算法前提:不能有负权边!需要哪些工具?(数据结构)算法具体步骤关键操作:松弛 (Relaxation)两种实现方式 (C 代码) 朴素版 Dijkstra (O(V^2))堆优化版 …...
脑影像分析软件推荐| GraphVar介绍
目录 1.软件界面 2.工具包功能简介 3.软件安装注意事项 1.软件界面 2.工具包功能简介 GraphVar是一个用户友好的 MATLAB 工具箱,用于对功能性大脑连接进行全面的图形分析。这里我们介绍了该工具箱的全面扩展,使用户能够无缝探索跨功能连接测量的可轻…...
如何优雅地实现全局唯一?深入理解单例模式
如何优雅地实现全局唯一?深入理解单例模式 一、什么是单例模式? 单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并为该实例提供全局访问点,从而避免全局变量的命名污染,并支持延迟初始化Wiki…...
【Flutter】使用LiveKit和Flutter构建实时视频聊天应用
引言 在当今快速发展的数字世界中,实时视频通信已成为许多应用程序的核心功能。无论是远程工作、在线教育还是社交网络,高质量的实时视频功能都至关重要。LiveKit作为一个开源的WebRTC解决方案,提供了构建可扩展实时音视频应用所需的一切工具…...
Android Jetpack Compose 状态管理解析:remember vs mutableStateOf,有啥不一样?为啥要一起用?
🌱《Jetpack Compose 状态管理解析:remember vs mutableStateOf,有啥不一样?为啥要一起用?》 在 Jetpack Compose 的世界里,UI 是响应式的。这意味着当状态发生变化时,UI 会自动重组࿰…...
QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)
(1) QT 在 c 的基础上增加了自己的编译器,以支持元对象系统和 UI 界面设计,有 MOC 、 UIC 等 QT 自己的编译器。本节的源代码里,为了减少篇幅,易于阅读,去除了上篇中的属性部分, 上篇…...
进程与线程:01 CPU管理的直观想法
多进程图像与操作系统核心 好从今天开始,我们就要开始学习操作系统,最核心的图像是多进程图像。前面我们讲过,多进程图像对操作系统来说非常重要,它是操作系统的核心图像。明白了它以后,对于理解操作系统的一大部分内…...
19. git reflog
基本概述 git reflog 的作用是:查看本地仓库的引用日志(reference log),例如分支、HEAD等。它可以帮助你找回误删的提交、恢复被覆盖的分支,或回溯操作历史。 基本用法 1.查看完整的reflog git reflog这会显示所有…...
C语言 —— 铭纹织构未诞之镜 - 预处理详解
目录 1. 什么是预处理(预编译) 编辑 2. 预定义符号 3. #define 定义常量 4. #define定义宏 5. 带副作用的宏参数 6. 宏替换的规则 7. 宏和函数的对比 8. #和## 8.1 #运算符 8.2 ## 运算符 9. #undef 10. 条件编译 1. 什么是预处理…...
Linux 文件系统目录结构详解
Linux 文件系统目录结构详解 Linux 文件系统遵循 Filesystem Hierarchy Standard (FHS) 标准,定义了各个目录的用途和文件存放规则。无论是开发者、运维工程师还是普通用户,理解这些目录的作用都至关重要。本文将全面解析 Linux 的目录结构,…...
2025-4-19 情绪周期视角复盘(mini)
我本以为市场进化规律下产生龙头战法的末法时代导致情绪周期逐步混乱或者说混沌期漫长。所谓的市场进化无非也是量化的发展和各类资金逐步量化化的充分博弈下的结果。通过逐步向上思考发现,不仅仅我们的市场是处于一个存量的时代背景,重要的是我们的思维…...
-实用类-
1. API是什么 2.什么是枚举 !有点类似封装! 2.包装类 注意: 1.Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false 2.当包装类构造方法参…...
Unity3D仿星露谷物语开发36之锄地动画2
1、目标 当角色锄地之后,地面会显示开垦后的样貌。 2、思路 上一篇中,虽然角色dig了hoe,同时grid属性也改变了,但是没有任何可视化的反馈。我们现在将添加新的功能,动态地将"dug ground"瓷砖添加到"…...
【备考高项】模拟预测题(一)案例分析及答案详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题 1】(10分)【问题 2】(5分)【问题 3】(4分)【问题 4】(6分)试题二【问题 1】(12分)【问题 2】(3分)【问题 3】(6分)【问题 4】(4分)试题三【问题 1】(4分)【问题 2】(10分)【问题 3】…...
7、sentinel
控制台访问地址:http://localhost:8080/ 依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>配置文件 spring:cloud:sentinel:transpo…...
状态管理最佳实践:Provider使用技巧与源码分析
状态管理最佳实践:Provider使用技巧与源码分析 前言 Provider是Flutter官方推荐的状态管理解决方案,它简单易用且功能强大。本文将从实战角度深入讲解Provider的使用技巧和源码实现原理,帮助你更好地在项目中应用Provider进行状态管理。 基…...
INFINI Console 系统集群状态异常修复方案
背景介绍 运行 INFINI Console 1.29.0 和 1.29.1 版本 的用户在 新初始化 平台后可能会遇到一个特定问题。如果后台的系统 Easysearch/Elasticsearch 集群(存储 Console 元数据的集群,通常名为 .infini_cluster 或类似名称)包含超过一个节点…...
Spring Boot自动装配原理(源码详细剖析!)
什么是Spring Boot的自动装配? 自动装配是Spring Boot的核心功能,它能够根据应用程序的依赖和配置自动配置Spring。这意味着我们只需要添加大量的依赖,Spring Boot就能自动完成配置,减少了人工配置的工作量。 自动装配的核心注…...
大数据驱动的高效能量管理:智能优化与实践探索
大数据驱动的高效能量管理:智能优化与实践探索 在全球能源需求不断增长的背景下,如何提高能源利用效率成为各行业关注的焦点。传统的能源管理方式往往依赖固定规则和人工监测,难以适应复杂多变的应用场景。而大数据技术的兴起,为能量管理提供了新的解决方案——通过数据驱…...
《银行数字化风控-业务于实战》读后知识总结
引言 在金融科技高速发展的今天,银行的风控体系正经历从“人工经验驱动”向“数据智能驱动”的深刻变革。《银行数字化风控-业务于实战》一书以实战为导向,系统性地剖析了数字化风控的核心逻辑、技术实现路径及业务落地方法论。作为深耕风控领域多年的从…...
初级达梦dba的技能水准
在x86环境(windows、linux)安装单机软件,安装客户端创建过至少20套数据库,优化参数并更新过正式许可会用逻辑导出导入以及dmrman备份了解manager工具的使用配置sqllog日志,并能解释输出内容能够分析因磁盘空间不足、内…...
C++初阶-类和对象(中)
目录 1.类的默认成员函数 2.构造函数(难度较高) 编辑 编辑 编辑 3.析构函数 4.拷贝构造函数 5.赋值运算符重载 5.1运算符重载 5.2赋值运算符重载 6.取地址运算符重载 6.1const成员函数 6.2取地址运算符重载 7.总结 1.类的默认成员函数…...
Linux网络UDP与TCP
基础知识 传输层 负责数据能够从发送端传输接收端。 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在 TCP/IP 协议中, 用 “源 IP”, “源端口号”, “目的 IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过 netstat -n 查看); 端口号范…...
23、.NET和C#有什么区别?
1、定义与范畴 .NET 定义 .NET 是一个由微软开发的开发平台(Platform),它提供了一套完整的工具、库和运行时环境,用于构建各种类型的应用程序。 范畴 包括 .NET Framework、.NET Core(现称为 .NET 5 及以上版本&a…...
Qt6离线安装过程
Qt6离线安装过程 说明解决方案联网笔记本安装qt6拷贝到离线电脑修改qtenv2.bat文件 说明 现在qt6已经不能通过离线的方式下载安装包安装了,只能通过登陆的方式在线安装,但是,又有离线安装运行的需求,那么怎么办呢?请跟…...
如何在 Go 中创建和部署 AWS Lambda 函数
AWS Lambda 是一个无服务器计算平台,您可以使用自己喜欢的编程语言编写代码,无需担心设置虚拟机。 您只需为 Lambda 函数的调用次数和运行时间(毫秒)付费。 我们大多数人都了解 JavaScript 和 Python,但它们的内存效率…...
【后端】【Django】Django 模型中的 `clean()` 方法详解:数据校验的最后防线
Django 模型中的 clean() 方法详解:数据校验的最后防线 在 Django 的模型系统中,我们经常使用字段级别的校验器(validators)来约束某个字段的取值范围。但当校验逻辑涉及多个字段之间的关系时,字段级别校验就无能为力…...
内存管理详解(曼波脑图超详细版!)
(✪ω✪)曼波来解答三连问啦!准备好内存知识大礼包了吗?(≧∇≦)ノ ━━━━━━━━━━━━━ ฅ^•ω•^ฅ ━━━━━━━━━━━ 一、内存分配详解 (๑>ᴗ<๑) (1) 栈内存 → 像便签纸📝 void calculate() {int a …...
【2025最新redis数据结构之Hypeloglog介绍】关于Hypeloglog
HyperLogLog (HLL) 算法深度解析 一、HLL 基本概念 HyperLogLog 是一种用于基数统计(distinct counting)的概率算法,能够在极小内存占用下(通常只需几KB)估算巨大数据集的基数(不重复元素数量)…...
软考复习——知识点软件开发
开发模型 瀑布模型 各个活动规定为线性顺序连接的若干阶段的模型。是一种理想的现象开发模型,缺乏灵活性,无法理解软件需求不明确或不准确的问题。适用于需求明确的项目。 演化模型 从初始的原型逐步演化成最终软件产品,特别适用于对软件…...
关于AI:记忆、身份和锁死
作者:John Battelle 当生成式AI迎来投资热潮、产品发布和炒作高峰时,我们大多数人在奔向“下一个大事件”的过程中,忽略了一个深层次的缺陷。我们现在主流的AI产品和服务(比如OpenAI、Google和Microsoft的产品)都是通过…...
2024新版仿蓝奏云网盘源码,已修复已知BUG,样式风格美化,可正常运营生产
说起网盘源码,网络上出现的也很多,不过可真正正能够用于运营的少之又少。今天将的蓝奏云网盘源码,其实网络上也有,不过是残缺版,bug很多。我今天分享的仿蓝奏云模板是经过长时间测试修复后的源码,源码实测可…...
OJ - 设计循环队列
622. 设计循环队列 - 力扣(LeetCode) 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则,并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可…...
实战指南:封装Faster-Whisper为FastAPI接口并实现高并发处理-附整合包
实战指南:封装Faster-Whisper为FastAPI接口并实现高并发处理-附整合包 「faster-whisper」 链接:https://pan.quark.cn/s/d4ddffb1b196 标题下面提供一个完整的示例,说明如何使用 FastAPI 封装 faster-whisper 接口,对外提供 RES…...
011数论——算法备赛
素数筛 给定n, 求2~n内的所有素数 埃氏筛 利用素数的定义, 输出素数2,然后筛掉2的倍数,得 {2,3,5,7,9,11,13,…}输出素数3,然后筛掉3的倍数,得 {2,3,5,7,11,13,…} 继续上述步骤࿰…...
C语言之机房机位预约系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之机房机位预约系统 目录 博客:机房机位预约系统设计与实现 系统功能概述…...
中间件--ClickHouse-14--案例-3-其他案例思路概述
1、广告投放效果分析 案例背景: 一家广告平台需要分析广告的点击、曝光、转化等数据,以优化广告投放策略并提升 ROI(投资回报率)。 解决方案: 数据接入:将广告投放相关的数据(如曝光、点击、…...
saas是什么?它做什么用的。及和Paas和laas有什么区别
Saas是什么?它做什么用的。及和Paas和laas有什么区别 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是行业内容。前后每一小节的内容是存在的有:学习and理解的关联性,希望对您有用~ 文…...
Qt基础005(文件操作后续)
文章目录 QFileDialogQFileDialog打开开发案例QFileDialog保存开发案例实现文件打开功能开发流程打开功能优化 QComboBoxQListExtraSelection 简介 QFileDialog QFileDialog打开开发案例 #include <QApplication> #include <QFileDialog> #include <QStringLi…...
松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)
摘要 本文以CobotMagic可移动协作机器人为研究对象,从硬件架构设计、软件系统架构、多传感器融合定位建图系统、智能导航系统协同机制四个维度,深入解析机器人系统工作原理。重点研究多传感器融合定位建图系统实现原理,结合实测数据验证系统…...
AI——神经网络以及TensorFlow使用
文章目录 一、TensorFlow安装二、张量、变量及其操作1、张量Tensor2、变量 三、tf.keras介绍1、使用tf.keras构建我们的模型2、激活函数1、sigmoid/logistics函数2、tanh函数3、RELU函数4、LeakReLu5、SoftMax6、如何选择激活函数 3、参数初始化1、bias偏置初始化2、weight权重…...
实现对象之间的序列化和反序列化
1.什么是序列化? 在项目的开发中,为了让前端更好的分析后端返回的结果,我们一般会将返回的信息进行序列化,序列化就是将返回对象的状态信息转换为一种标准化的格式,方便在网络中传输也方便打印日志时号观察࿰…...
QML中日期处理类
在 QML 中处理日期和时间主要使用 JavaScript 的 Date 对象以及 Qt 提供的一些相关功能。以下是常用的日期处理方式: 1. JavaScript Date 对象 QML 可以直接使用 JavaScript 的 Date 对象: qml // 创建当前日期时间 var currentDate new Date()// 创…...
基于docker-java封装的工具类
基于docker-java封装的工具类 背景环境工具类 背景 写OJ系统时需要用docker作为代码沙箱使用,顺手封装了一个工具类,给自己做个笔记,如果可以的话也希望帮助到其他人。 环境 docker 26.1.4docker-java 3.4.2docker-java-transport-httpcli…...
windows docker desktop 无法访问容器端口映射
为什么使用docker desktop访问映射的端口失败,而其端口对应的服务是正常的? 常见问题,容器的防火墙没有关闭!!! 以centos7为例,默认情况下防火墙处于开启状态: 这下访问就OK了...
ReentrantReadWriteLock读写锁
一、锁的分类 这里不会对Java中大部分的分类都聊清楚,主要把 **互斥,共享** 这种分类聊清楚。 Java中的互斥锁,synchronized,ReentrantLock这种都是互斥锁。一个线程持有锁操作时,其他线程都需要等待前面的线程释放锁…...
Vue.js 入门教程
Vue.js 入门教程 Vue.js 是一款非常流行的前端 JavaScript 框架,适用于构建用户界面。它的设计思想是尽可能简单、灵活,易于与其他库或现有项目整合。本文将从最基础的概念开始,逐步引导你学习 Vue.js。 一、Vue.js 基础概念 1.1 什么是 V…...
解决Docker 配置 daemon.json文件后无法生效
vim /etc/docker/daemon.json 在daemon中配置一下dns {"registry-mirrors": ["https://docker.m.daocloud.io","https://hub-mirror.c.163.com","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","ht…...
wpf stylet框架 关于View与viewmodel自动关联绑定的问题
1.1 命名规则 Aview 对应 AVIewModel, 文件夹 views 和 viewmodels 1.2 需要注册服务 //RootViewModel是主窗口 public class Bootstrapper : Bootstrapper<RootViewModel>{/// <summary>/// 配置IoC容器。为数据共享创建服务/// </summary…...
车载测试用例开发-如何平衡用例覆盖度和测试效率的方法论
1 摘要 在进行车载测试用例编写时,会遇到多个条件导致用例排列组合爆炸的情况,但是为了产品测试质量,我们又不得不保证用例设计的需求覆盖度,这样又会使得测试周期非常长。我们如何平衡效率和测试质量?本文进行了一些…...