【代码随想录day59】【C++复健】 47. 参加科学大会(dijkstra(堆优化版)精讲 );94. 城市间货物运输 I
前几天有些事情耽搁了,不过好在图论我完全不会,所以偷看代码思路也没有任何的心理负担,做起来反而相对独立思考更快一点点。
47. 参加科学大会(dijkstra(堆优化版)精讲 )
本来一开始以为这个堆优化版相对于朴素版就类似于kruskal算法之于prim算法,定睛一看才发现并非如此,区别还是有很多的。
因为是时隔好几天回来写代码,有一种恍若隔世的感觉,甚至有点忘了kruskal/prim以及dijkstra算法都是针对什么问题的,所以就问了一下GPT,没想到还是挺有收获的:
1. 计算目标的不同:
Prim 和 Kruskal:
- 目标:构造一棵 最小生成树 (Minimum Spanning Tree, MST)。
- 目的在于找到一个无向图中连接所有节点的总权重最小的树。
- 生成树不关注特定的起点或终点,而是全图的一种全局性质。
- MST 确保所有节点都被连接且总权重最小,但并不保证某个节点到另一个节点的最短路径。
Dijkstra:
- 目标:计算一个特定起点到图中所有其他节点的 最短路径。
- 主要用于单源最短路径问题。
- 仅关注从起点到终点的最短权重和路径,而不会覆盖所有节点。
2. 输入图类型的不同:
特性 | Prim/Kruskal | Dijkstra |
---|---|---|
图类型 | 无向图 | 有向图或无向图均可 |
边权值特性 | 权值非负(负权值不影响) | 权值必须非负 |
3. 使用的算法思想:
Prim:
- 基于 贪心法 构造 MST。
- 从某个节点出发,每次选择权值最小的边扩展树,直到包含所有节点。
- 支持动态增加节点,并使用优先队列进行优化(时间复杂度可以为 O((n+m)logn)O((n + m) \log n)O((n+m)logn))。
Kruskal:
- 基于 贪心法 和 并查集,构造 MST。
- 将图中的所有边按权值排序,然后从最小权值开始加入树中,同时避免形成环。
- 更适合处理稀疏图,时间复杂度为 O(mlogm)O(m \log m)O(mlogm),其中 mmm 是边的数量。
Dijkstra:
- 基于 贪心法 和优先队列。
- 从起点出发,每次选择当前路径最短的节点,更新邻接节点的最短距离,直到所有节点的最短距离确定。
- 时间复杂度为 O((n+m)logn)O((n + m) \log n)O((n+m)logn)。
4. 结果的不同:
Prim 和 Kruskal:
- 输出是一个包含 n−1n-1n−1 条边的 最小生成树。
- 生成树覆盖了所有节点,但并不提供任何节点对之间的最短路径信息。
- 最小生成树 ≠ 最短路径树(MST 不适合直接用于单源最短路径问题)。
Dijkstra:
- 输出是从起点到其他节点的最短路径。
- 生成的树是以起点为根的 最短路径树。
- 最短路径树并不一定是最小生成树,因为两者优化目标不同。
简单来说,kruskal/prim的最终目的是要找一个最小生成树把所有节点都连起来,而dijkstra单纯只是想知道从a到b的最短路径是什么。
那次是很容易想到一个新的问题:最小生成树当中两个节点之间的距离是最短路径吗?
并不是。比如最小生成树当中有可能是a-d,c-d,那我从a到c就是a-d加上c-d的权值,那假设我有一个直接连接a-c的边且权值比a-d加上c-d的权值要小,那最小生成树里的这个权值就不是最短路径。举个例子:
(2) (4)A ------- B -------- C\ /(3)\ /(3)D/ \(6)/ \(1)E -------- F(5)
最终最小生成树是这样的:
(2) (4)A ------- B -------- C\(3)\D ----- F(1)\(5)\E
按树去算就会得到6而不是4(ac的边权值)。
好了,接下来就来边看解析边抄代码:
1 专门定义了一个类来比较小顶堆里面元素的大小,不知道如果单纯用一个bool类型的函数能不能行?
本来以为是可以的,因为sort函数就可以传一个简单函数,但实际一跑发现报错了,方知这样是不行的,原因我们还是看GPT的说法:
1. std::sort
与 priority_queue
的实现差异
-
std::sort
:std::sort
是一个算法,通常是实现为一个模板函数。它接受一个比较器(可以是普通函数、函数指针、函数对象、或者 lambda 表达式),并且这个比较器是传递给算法的一个参数。在排序的过程中,std::sort
会根据比较器对元素进行比较排序。std::sort
内部通常是通过循环遍历容器来进行排序,比较操作只是其中的一个环节。传递给std::sort
的比较器(无论是函数指针还是函数对象)会被调用来决定两个元素的顺序。这种设计允许函数指针或者函数对象作为比较器,因为它们是可以被直接调用的。 -
priority_queue
:std::priority_queue
是一个容器适配器,它通过底层的容器(通常是vector
或deque
)来维护元素,并且提供一个优先级的队列结构。其最大特点是它内部会自动维护一个堆结构(通常是最大堆或者最小堆),并且它会根据优先级进行自动排序。由于
priority_queue
是一个容器适配器,它并不直接进行排序,而是通过对元素进行插入、删除的操作来维护堆结构。它需要一个比较器来定义堆的排序规则。在这种情况下,priority_queue
需要一个 可调用的对象(例如函数对象、函数指针、lambda 表达式)作为比较器,而不能直接使用普通的函数。当你使用普通函数时,
priority_queue
无法直接使用它,因为 C++ 中的普通函数并不直接满足可以作为比较器使用的要求。priority_queue
需要一个函数对象,而函数对象必须满足operator()
可以被调用。
2. 普通函数与函数对象的区别
-
普通函数: 普通函数(例如
bool cmp(pair<int, int> a, pair<int, int>)
)不是一个类或对象,不能像对象那样通过()
调用。因此,不能直接作为priority_queue
的比较器。priority_queue
期望比较器是一个具有调用操作符operator()
的对象。 -
函数对象: 函数对象(或可调用对象)是一个类的实例,并且这个类实现了
operator()
。这使得函数对象可以像函数一样被调用,从而可以作为比较器传递给priority_queue
。例如:struct Compare {bool operator()(const pair<int, int>& a, const pair<int, int>& b) {return a.second > b.second; // 最小堆的比较规则} };
-
Lambda 表达式: Lambda 表达式本质上也是一个匿名的函数对象,它也实现了
operator()
。因此,你可以将 lambda 表达式直接传递给priority_queue
,像传递函数对象一样:priority_queue<pair<int, int>, vector<pair<int, int>>, function<bool(pair<int, int>, pair<int, int>)>> pq([](pair<int, int> a, pair<int, int> b) {return a.second > b.second; // 最小堆});
3. std::sort
和 priority_queue
的设计目的不同
-
std::sort
:是一个排序算法,处理的是一次性对所有元素进行排序。它只是对容器中的元素进行排序,并不需要维持元素的顺序或者结构,因此它可以直接接收一个普通函数或者其他任何可调用对象作为比较器。 -
priority_queue
:是一个数据结构,旨在维护一个元素的优先级队列,它会根据优先级的顺序来自动调整元素的顺序。因此,priority_queue
必须保持一个堆结构,并且它在每次插入或弹出元素时都会重新调整堆的顺序。为了实现这一点,它要求传入一个比较器,来定义元素的优先级。
4. 函数指针和函数对象的不同
std::sort
支持函数指针,因为它不需要持续保持比较操作符,排序完成后就不再需要调用比较器了。priority_queue
需要的是一个 可调用对象(通常是一个函数对象),它持续地在队列内部进行元素比较。因此,直接使用普通函数会导致不兼容的情况。
结论
std::sort
可以接受普通函数作为比较器,是因为它只是作为一个排序算法,传入的比较器是一次性使用的,不需要持续地调用。priority_queue
需要一个 函数对象 或其他可调用对象(比如 lambda),因为它需要一个在每次操作(插入、弹出)时都可以调用的比较器。
但我看到这里还是没看太懂,为什么它那样写就是一个可调用对象呢?我继续追问,得到了这样的答案:
1. 普通函数 vs 可调用对象
-
普通函数: 普通函数是一个具有特定名称和签名的函数。在 C++ 中,普通函数只是一个代码块,它并不具备像对象那样的状态,也没有成员函数,因此不能像对象一样直接调用。你只能通过名称来调用它,并且它不能像对象一样持有数据或状态。
比如:
bool cmp(pair<int, int> a, pair<int, int> b) {return a.second > b.second; // 比较函数 }
这个函数 可以作为参数传递给
std::sort
等算法,但它不能直接作为一个对象一样被调用。你通常需要通过函数指针来传递它。 -
可调用对象(Callable Object): 可调用对象是一个实现了
operator()
的对象(通常是一个类或结构体)。这样,它的实例就变成了一个可以像函数一样被调用的对象。换句话说, 只要某个类或者结构体重载了operator()
,它就变成了一个可调用对象。举个例子,像你提到的
Compare
:bool cmp(pair<int, int> a, pair<int, int> b) {return a.second > b.second; // 比较函数 }
在这个例子中,
Compare
是一个结构体,它定义了operator()
,使得它的对象变得 可调用。这意味着你可以通过()
运算符直接调用Compare
类的对象,像调用普通函数一样。例如:
struct Compare {bool operator()(const pair<int, int>& a, const pair<int, int>& b) {return a.second > b.second; // 比较规则} };
在这种情况下,
Compare
结构体的对象cmp
充当了一个 可调用对象,它的operator()
被用作比较操作。
2. 为什么 Compare
是可调用对象,而普通函数不是?
关键点在于 operator()
,这是 C++ 中让对象变得可调用的机制。普通函数是没有 operator()
的,因此它们不能像对象一样被调用,只能通过函数指针传递给其他函数或容器。
operator()
的作用:
当你在类或结构体中定义了 operator()
,你实际上让这个类或结构体的对象变得可以像函数一样调用。这样,你就能通过 实例化类/结构体对象并调用该对象的 operator()
来实现功能。operator()
可以持有状态或数据,因此它比普通函数更加灵活。
2 定义了一个edge类型,还有构造函数,构造函数是为了后写 vector[left].push_back(Edge(right, val));的时候往里面直接插入edge类型的元素,但是为什么后面在定义有限对了的时候写的是priority_queue<pair<int, int> 而不是 priority_queue<Edge呢?
在定义上来说,这个优先队列里面存的是从源点出发到当前节点的距离,而并不是带权值的边,在定义上是不太对头的,但如果真的写成edge,然后里面存从源点出发到当前节点的距离,语法上也是不会报错的,并且也能得到正确答案,但可读性就很差了。
3 我会觉得pirorty_queue<pair<int, int>, vector<pair<int, int>, cmp> pq;这句话里面,第二个参数其实已经完全包含了第一个参数里面的信息,所以比较好奇C++为什么是这样设置的,但问了GPT半天它也没讲太明白,我就不放上来了,就当是c++的一个不太合理之处吧。
4 卡哥代码里面有这样一段:
for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge// cur指向的节点edge.to,这条边的权值为 edge.valif (!visited[edge.to] && minDist[cur.first] + edge.val < minDist[edge.to]) { // 更新minDistminDist[edge.to] = minDist[cur.first] + edge.val;pq.push(pair<int, int>(edge.to, minDist[edge.to]));}}
当时看完了感觉这样插入可能会产生很多无效的距离被插入的情况,因为后续当mindist更新的时候,前面的更长的那个距离已经被push进到最小堆里面去了。不过这也是没办法的事情,不这样写的话甚至不知道怎么写插入的代码。而且只要再加上这样一句:
if(visited[cur.first]){continue;}
就能把那些并非最优的情况(已经在前面已经有更小的距离出现,并且已经访问过)滤掉(一开始还在好奇为什么写这么一句,现在懂了)。
还有若干问题,比如初始化边的时候应该是i < m才对,结果写成了i < n;还有就是下标从1开始,结果我又初始化了0号位,导致产生问题...
#include<iostream>
#include<vector>
#include<list>
#include <queue>
#include <climits>
using namespace std;struct Edge{int to, val;Edge(int t, int v):to(t), val(v){}
};struct Compare {bool operator()(const pair<int, int>& a, const pair<int, int>& b) {return a.second > b.second;}
};int main(){int n, m;cin >> n >> m;vector<list<Edge>> grid(n+1);for(int i=0; i<m; i++){int left, right, val;cin >> left >> right >> val;grid[left].push_back(Edge(right, val));}vector<int> mindist(n+1, INT_MAX);vector<bool> visited(n+1);priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq;pq.push({1, 0});mindist[1] = 0;while(!pq.empty()){pair<int, int> cur = pq.top();pq.pop();if(visited[cur.first]){continue;}visited[cur.first] = true;for(Edge edge: grid[cur.first]){if(!visited[edge.to] && mindist[cur.first] + edge.val < mindist[edge.to]){mindist[edge.to] = mindist[cur.first] + edge.val;pq.push(pair<int, int>(edge.to, mindist[edge.to]));}}}if(mindist[n] == INT_MAX){cout << -1;}else{cout << mindist[n];}
}
94. 城市间货物运输 I
老样子边看解析边抄,看了之后发现插入元素用的grid.push_back({p1, p2, val});。这个和 grid[p1][p2] = val;一样吗?完全不一样,虽然都是两层vector,一个存的是点的格子,另一个是所有边的集合。
#include<iostream>
#include<vector>
#include<list>
#include<climits>
using namespace std;int main(){int n, m;cin >> n >> m;vector<vector<int>> grid;for(int i=0; i<m; i++){int left, right, weight;cin >> left >> right >> weight;grid.push_back({left, right, weight});}int start = 1;int end = n;vector<int> mindist(n+1, INT_MAX);mindist[start] = 0;for(int i=1; i<n; i++){for(vector<int>& side: grid){int left = side[0];int right = side[1];int val = side[2];if(mindist[left] != INT_MAX && mindist[left] + val < mindist[right]){mindist[right] = mindist[left] + val;}}}if (mindist[end] == INT_MAX) {cout << "unconnected";}else{cout << mindist[end];}
}
总的来说本题并不像上一题一样细节很多而且用到了很多不熟悉的东西,本题思路很简单,就是两个for循环挨个节点去遍历,总共搞n-1次,自己写估计也能做,但是有点被上一题搞怕了,还以为这个题会更难,直接就抄了。
相关文章:
【代码随想录day59】【C++复健】 47. 参加科学大会(dijkstra(堆优化版)精讲 );94. 城市间货物运输 I
前几天有些事情耽搁了,不过好在图论我完全不会,所以偷看代码思路也没有任何的心理负担,做起来反而相对独立思考更快一点点。 47. 参加科学大会(dijkstra(堆优化版)精讲 ) 本来一开始以为这个堆…...
【网络安全】WIFI WPA/WPA2协议:深入解析与实践
WIFI WPA/WPA2协议:深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量,捕获设备与接入点之间的 4 次握手数据。然而,设备通常不会频繁连接或重新连接,为了加速过程,攻…...
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
题目: 两个方法本质就是决策树的画法不同 方法一解析: 代码: class Solution {private List<List<Integer>> ret;//返回结果private List<Integer> path;//记录路径,注意返回现场public List<List<Int…...
试题转excel;word转excel;大风车excel
一、问题描述 一名教师朋友,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几乎需要一个下午的时间 关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作 就想着做一个工具,可以自动处理…...
Unity NTPComponent应用, 实现一个无后端高效获取网络时间的组件
无后端高效获取网络时间的组件 废话不多说,直接上源码m_NowSerivceTime 一个基于你发行游戏地区的时间偏移, 比如北京时区就是 8, 巴西就是-3,美国就是-5using Newtonsoft.Json; 如果这里报错, 就说明项目没有 NewtonsoftJson插件…...
复合机器人为生产提供精准的建议和决策支持
在现代化生产的浪潮中,智能复合机器人以其卓越的性能和高度智能化特点,正成为保障生产安全与可靠性的重要力量。 智能复合机器人具备精确的感知、判断和决策能力,能够在复杂的生产环境中自主导航、精确操作,避免了人为因素可能导致…...
springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码
springboot/ssm二手儿童绘本交易系统Java代码编写web项目闲置书籍源码 基于springboot(可改ssm)vue项目 开发语言:Java package com.controller;import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Map;import javax.s…...
30. Three.js案例-绘制并渲染圆弧
30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象ÿ…...
类和对象(2)
大家好,今天我们继续来学习类和对象的知识,那么今天我们来看看类的概念和类的定义相关的知识,那么话不多说,我们直接开始。 2.类定义和使用 面向对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机,但是…...
240004基于ssm+maven+mysql+Java的房屋租赁系统的设计与实现
基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…...
HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别
在为您的应用程序选择通信协议时,有很多不同的选择。 本文将了解四种流行的解决方案:HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进:变得更快、更方便、更可靠&…...
FlowNex 中的两相建模基础知识
通过 FlowNex 中的两相建模解开高效流体动力学的秘密,彻底改变制造业。 挑战 两相流是指两个不同相(通常是液体和气体)同时流动,它们具有不同的特性和行为。在制造业中,了解两相流对于优化热交换器、化学反应器和流体…...
Mysql笔记
windows安装记录Windows中Mysql安装-CSDN博客 用到的库 通过网盘分享的文件:atguigudb.sql 链接: https://pan.baidu.com/s/1YfC20c2vK9odn-XRJJwUJw 提取码: utk7 --来自百度网盘超级会员v5的分享 Mysql4中表关联关系 1.1对1,比较少用,因为完全可以一张表,当有…...
docker拉取rabbitmq镜像安装延迟队列插件
我这里使用的是rabbitmq:3.12.0-management版本作为示例 1.拉取rabbitmq镜像 docker pull rabbitmq:3.12.0-management 2.启动rabbitmq docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 在咱们拉取时如果出现连接超时可…...
创建一个谷歌插件项目dome上线流程+源码
创建一个简单的 Chrome 扩展程序,其主要功能是 JSON 格式化。用户可以通过点击扩展图标打开一个弹出窗口,在弹出窗口中输入或粘贴 JSON 数据,然后点击格式化按钮来格式化 JSON 数据 谷歌插件(即 Chrome 扩展程序)主要设…...
举例说明如何在linux下检测摄像头设备具备的功能
假设摄像头设备文件为/dev/video1 ,下面是一个专门用于检测 /dev/video1 设备能力的简化程序。这个程序将打印出设备的所有能力、格式和其他相关信息,以帮助你了解设备支持的功能。 检测 /dev/video1 设备能力的程序 #include <fcntl.h> #includ…...
win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录
win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录 参考教程 : win10配置子系统Ubuntu子系统(无需通过Windows应用市场) - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 …...
东北大学《2024年839自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《东北大学839自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
5G中的ATG Band
Air to Ground Networks for NR是R18 NR引入的。ATG很多部分和NTN类似中的内容类似。比较明显不同的是,NTN的RF内容有TS 38.101-5单独去讲,而ATG则会和地面网络共用某些band,这部分在38.101-1中有描述。 所以会存在ATG与地面网络之间的相邻信…...
nginx负载均衡配置
目录 一、简介 二、nginx下载 二、nginx配置 四、注意点 (1)/api与/api/的区别 (2)http://gatewayserver与http://gatewayserver/的区别 一、简介 Nginx(发音为 "engine-x")是一个高性能的HTTP和反向代理服务器,也是一个IMA…...
【教学类-83-02】20241214立体书三角嘴2.0——青蛙(扁菱形嘴)
背景需求: 制作小鸡立体贺卡三角嘴,它的嘴是正菱形(四条边长度相等,类似正方形) 【教学类-83-01】20241215立体书三角嘴1.0——小鸡(正菱形嘴)-CSDN博客文章浏览阅读744次,点赞22次…...
vscode设置终端代理
转载请标明出处:小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…...
【C++】函数计算题解论
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯思路解析3.1 函数的递归定义3.2 边界条件控制3.3 记忆化搜索 💯C实现代码💯添加解释💯小结 💯前言 在…...
Redis篇-21--运维篇3-集群(分片,水平扩展,高可用,集群配置案例,扩展哨兵案例)
1、概述 Redis集群(Cluster)通过分片(sharding)实现了水平扩展,允许数据分布在多个节点上,从而提升性能和存储容量。 在Redis集群中,数据被分割成16384个哈希槽(hash slots&#x…...
Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
注明:网络素材,仅供学习使用! https://download.csdn.net/download/elineSea/90017291...
深入理解addEventListener中的第二个参数:listener
起因 首先,之前留给我们的一点东西,js的深入内容关键在addEventListener,这个函数中的参数,它们三个参数,分别为type、listener、options,当然在这里还有一些小的问题,比如mdn文档中它介绍到了另…...
数据库镜像(Database Mirroring):高可用性与灾难恢复技术
一、引言 在现代信息系统中,数据的可用性和完整性至关重要,尤其是对金融、电商、医疗等高并发和高可靠性要求的行业。数据库镜像(Database Mirroring) 作为一种高可用性与灾难恢复技术,通过将主数据库的数据实时复制到…...
【Qt】按钮类控件:QPushButton、QRadioButton、QCheckBox、ToolButton
目录 QPushButton 例子: QRadioButton 例子: 按钮的常见信号函数 单选按钮分组 例子: QCheckButton 例子: QToolButton QWidget的常见属性及其功能对于它的派生类控件都是有效的(也就是Qt中的各种控件),包括…...
day-21 内核链表以及栈
1.昨日作业 1.删除指定节点 找到删除就完事了,双向可以停在删除处。 /***************************** 功能:删除指定结点(通过姓名)* 参数:phead;oldname; * 返回:成功0,失-1&…...
深度与视差的关系及其转换
深度与视差的关系及其转换 在计算机视觉和立体视觉中,深度和视差是两个重要的概念。理解这两者之间的关系对于实现立体图像处理、三维重建以及深度估计至关重要。在这篇博客中,我们将深入探讨深度和视差的概念,并介绍它们之间的转换关系。 …...
Unity全局光照详解
之前就学过但是太久没用又忘了,因此用最简洁易懂的语言做个记录。 全局光照分为两个系统,分别是实时光照和混合光照。(点击window/Rendering/Lighing打开此面板) 其中全局光照对于我来说都是新技术了,上一次学…...
外观模式的理解和实践
外观模式(Facade Pattern)是一种常用的软件设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。该模式定义了一个高层的接口,使得子系统更容易使用。简单来说,外观模式就是通过引入一个外观角色…...
【前端知识】Javascript进阶-类和继承
文章目录 概述一、类(Class)二、继承(Inheritance) 三、继承的实现方式作用一、类和作用二、继承和作用 概述 当然可以,以下是对JavaScript中类和继承的详细介绍: 一、类(Class) 定…...
Kylin麒麟操作系统 | Nginx服务部署
目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器ÿ…...
51单片机--- 串口控制仿真
51单片机--- 串口控制仿真 实验目标:51单片机接收串口数据,根据数据点亮LED。 实验步骤: 在Proteus里画出原理图 在Keil里用C语言编写程序 在Proteus中导入HEX文件,启动仿真 实验协议: 波特率115200 数据位:8位,停止位:1位,校验位:无。 命令格式: 一条命令为…...
<数据集>输电线塔杂物识别数据集<目标检测>
数据集下载链接 <数据集>输电线塔杂物识别数据集<目标检测>https://download.csdn.net/download/qq_53332949/90141102数据集格式:VOCYOLO格式 图片数量:1099张 标注数量(xml文件个数):1099 …...
HarmonyOS学习 --- Mac电脑获取手机UDID
一,手机打开开发者选项 1,打开“设置 > 关于本机”,连续点击7次版本号,打开开发者选项。 2,打开“USB调试”。 二,配置环境变量 获取OpenHarmony SDK 安装路径 /Users/admin/Library/OpenHarmony/Sdk/10…...
OpenIPC开源FPV之Adaptive-Link地面站代码解析
OpenIPC开源FPV之Adaptive-Link地面站代码解析 1. 源由2. 框架代码3. 软件配置3.1 默认配置3.2 加载配置3.3 更新配置 4. 通信例程4.1 TCP报文解析4.2 UDP报文发送 5. 特殊指令5.1 request_keyframe5.2 drop_gop5.3 resume_adaptive5.4 pause_adaptive 6. 总结7. 参考资料 1. 源…...
Linux Docker环境中解决中文字体乱码问题完整指南
问题背景 在Linux Docker环境中运行涉及中文显示的应用时(如Selenium网页截图、PDF生成等),经常会遇到中文显示为方块或乱码的问题。这是因为Linux系统默认没有安装中文字体所导致的。 解决方案 我们可以从Windows系统复制常用中文字体到D…...
[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用
目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…...
用于卫星影像间接RPC模型精化的通用光束法平差方法
引言 介绍了通用RPC模型的表达式,which has been down to death 描述了RPC模型产生误差的原因——主要与定义传感器方位的姿态角有关。 每个影像都会对应一个三维点云,但是对同一地物拍摄的不同影像对应出来的三维点云是不一样的,所以才需…...
关于Redis主从复制实验操作
需要搭建帮助的可以去taobao搜索Easy Company技术服务,谢谢!!! 需要搭建帮助的可以去taobao搜索Easy Company技术服务,谢谢!!! Redis主从复制需要一主二从(共三个Redis…...
【HarmonyOS】鸿蒙获取appIdentifier,Identifier
【HarmonyOS】鸿蒙获取appIdentifier,Identifier 一、前言 三方后台需要填写的所谓appIdentifier,Identifier信息,其实对应鸿蒙应用的appID。 二、解决方案: 注意,模拟器获取data.signatureInfo.appIndentifer为空…...
matplotlib(二)
目录 1、折线图(plot)与基础绘制图功能 1.1、设置图形风格 2、多坐标系显示图像 3、折线图的应用场景 1、折线图(plot)与基础绘制图功能 # import matplotlib.pyplot as plt # import random # #1.创建画布 # plt.figure(figs…...
Jenkins容器使用宿主机Docker(五)
DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六&#…...
基于前后端分离的食堂采购系统源码:从设计到开发的全流程详解
本篇文章,笔者将从系统设计到开发的全过程进行详解,帮助开发者和企业了解如何高效构建一套完善的食堂采购系统。 一、系统需求分析 在开发一套基于前后端分离的食堂采购系统前,必须对业务需求和功能模块进行详细分析,确保系统设…...
git使用教程(超详细)-透彻理解git
一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉,我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录,你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…...
Bugku---misc---隐写2
题目出处:首页 - Bugku CTF平台 ✨打开发现是一张图片,于是查看属性,放在010查看,这都是基本步骤了,发现里面有一个flag.rar!!!拿binwalk分析也确实存在 ✨于是按照压缩包的起始位置…...
数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)
数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考,摘录一些书中关于维度建模比较重要的思想与大家分享🤣🤣🤣 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读,感受一下…...
将 Ubuntu 22.04 LTS 升级到 24.04 LTS
Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年,直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一,把系统中的重要数据自己备份一下~ 安装配置SSH访问…...