离散化的两种实现方式【sort或者map】

离散化

定义

把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
适用范围:数组中元素值域很大,但个数不是很多。
比如将a[]=[1,3,100,2000,500000]映射到[0,1,2,3,4]这个过程就叫离散化。

两种离散化方式

1.利用sort+unique进行数据离散化(适用于区间查找,及更新)

常与前缀和、树状数组、线段树和动态规范结合考查。

先来看一个金典题目:
题目
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [ l , r ] 之间的所有数的和。

输入格式:
第一行包含两个整数 n 和 m。
接下来 n行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。

输出格式:
共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围:
−109 ≤ x ≤ 109

1 ≤ n ≤ 105

1 ≤ m ≤ 105

−109 ≤ l ≤ r ≤ 109

− 10000 ≤ c ≤ 10000
输入样例
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例
8
0
5
思路:
由于1 ≤ n ≤ 105 和1 ≤ m ≤ 105 所调用的数字范围较小,而数轴范围较大,故可以将通过离散化处理,将−109 ≤ x ≤ 109
范围缩为 −105 ≤ x ≤ 105 左右,大大提高效率。
在这里插入图片描述
代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 3 * 1e5 + 10;
int a[N], s[N];
vector<int> alls;
vector<PII> add, query;// 二分查找
int find(int x)
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + ((r - l) >> 1);if (alls[mid] >= x) r = mid;else l = mid + 1;}return l + 1; // 由于S是从1开始的,所以对应映射位置都往前提一位
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < n; ++i){int x, c;cin >> x >> c;add.push_back({x, c});alls.push_back(x);}for (int i = 0; i < m; ++i){int l, r;cin >> l >> r;query.push_back({l, r});alls.push_back(l);alls.push_back(r);}sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());for (auto& item : add){int x = find(item.first);a[x] += item.second;}for (int i = 1; i <= alls.size(); ++i) s[i] = s[i - 1] + a[i];for (auto& item : query){int l = find(item.first), r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}

当然这里也可以用数组+lower_bound来做,下面会说

1.1 Mayor’s posters POJ - 2528

在这里插入图片描述
思路:
可以将问题转化为,求区间的最小值,让每个区间的海报标记为第i个放的,然后用线段树来做。
查询每个海报区间的最小值是否等于i,如果等于i则没有被完全覆盖。本题的数据量太大,区间是[1, 1e7],
所以要用离散化,存取l和r的相对大小,因为n = 1e4,所以离散过后的区间为[1, 2 * n]。
时间复杂度O(nlogn)

#include<cstdio>
#include<map>
#include<iostream>
#include<algorithm>
#define ls 		rt << 1, l, m
#define rs 		rt << 1 | 1,  m + 1, r
using namespace std;
const int maxn = 2e4 + 5;
int mi[maxn << 2], a[maxn], add[maxn<<2];
struct node{int l, r, pos;
}arr[maxn];
int n;
void pushUp(int rt){mi[rt] = min(mi[rt << 1], mi[rt << 1 | 1]);
}
//下推标记 
void pushDown(int rt){add[rt << 1] = add[rt];add[rt << 1 | 1] = add[rt];mi[rt << 1] = add[rt];mi[rt << 1 | 1] = add[rt];add[rt] = 0;
}
//建树,此过程可用memset代替 
void build(int rt, int l, int r){if (l == r){mi[rt] = 0;return;}int m = (l + r) >> 1;build(ls);build(rs);pushUp(rt);
}
//区间修改 
void update(int rt, int l, int r, int L, int R, int C){if (L <= l && r <= R){mi[rt] = C;add[rt] = C;return;}if(add[rt] != 0)	pushDown(rt);int m = (l + r) >> 1;if (L <= m)		update(ls, L, R, C);if (m < R)		update(rs, L, R, C);pushUp(rt);
}
//查询区间最小值 
int query(int rt, int l, int r, int L, int R){if (L <= l && r <= R){return mi[rt];}if (add[rt] != 0)	pushDown(rt);int m = (l + r) >> 1;int res = maxn;if (L <= m)		res = min(res, query(ls, L, R));if (m < R)		res = min(res, query(rs, L, R));return res;
}
//离散化 
void disc(int cnt){sort(a, a + cnt);int lena = unique(a, a + cnt) - a;for (int i = 0; i < n; ++i){arr[i].l = lower_bound(a, a + lena, arr[i].l) - a + 1;arr[i].r = lower_bound(a, a + lena, arr[i].r) - a + 1;//	printf("l = %d   r = %d\n", arr[i].l, arr[i].r);}
}
void solve(){scanf("%d", &n);build(1, 1, n << 1);int cnt = 0;for (int i = 0; i < n; ++i){scanf("%d%d", &arr[i].l, &arr[i].r);arr[i].pos = i + 1;a[cnt++] = arr[i].l;a[cnt++] = arr[i].r;}disc(cnt);for (int i = 0; i < n; ++i){update(1, 1, n << 1, arr[i].l, arr[i].r, arr[i].pos);} int ans = 0;for (int i = 0; i < n; ++i){int x = query(1, 1, n << 1, arr[i].l, arr[i].r);//printf("x = %d\n", x);if (x == arr[i].pos)	ans++;}printf("%d\n", ans);
}
int main(){int t;scanf("%d", &t);for (int i = 0; i < t; ++i) solve();return 0;
}

1.2 Mayor’s posters POJ - 2528

/*
需要计划你接下来k天的日程。在每一天里.她可以选择学习或者颓废,但是为了劳逸结合,日程表有两类限制:
1、在某个时间段中至少有一天要学习。
2、在某个时间段中至少有一天要颓废。
请问一共有多少种合法的日程表?答案对1000000007取模。
输入格式
第一行三个非负整数k,n,m,分别表示天数,至少有一天学习的时间段个数和至少有一天颓废的时间段个数。
接下来n行,每行两个正整数l,r,表示第l至第r天中至少有一天学习。
接下来m行.每行两个正整数l,r,表示第l至第r天中至少有一天颓废。
输出格式
一行一个整数,表示答案对1000000007取模后的结果。
样例输入 
5 2 2
1 3
3 5
2 2 
4 5
样例输出 
8以下把学习称为填黑,颓废称为填白。先离散化一下,每段有三种情况∶全黑、全白、有黑有白。
最终方案需要满足没有一个连续黑段包含完整的第二类区间,也没有一个连续白段包含完整的第一类区间。
设fi.gi,hi表示从左到右填到第i段,且结尾是黑、白、有黑有白的合法方案数,那么i这个位置往前的最长黑色、白色连续
段长度很容易求出,转移用前缀和优化一下就行了。复杂度瓶颈是离散化。
也有开两个线段树记录最后一个和末尾不同的位置的做法,但是比较难写,常数也较大,可能被卡常。接着,我们使用动态规划来计算填黑和填白的方案数。我们用fs[i]表示以第i个时间段结尾的全填黑的方案数,ft[i]表示以第i个时间段结尾的全填白的方案数,g[i]表示以第i个时间段结尾有黑有白的方案数。对于fs[i],我们可以根据之前的结果得到,如果第i个时间段全填黑,那么前一个时间段只能全填白或者有黑有白,所以有fs[i] = (sg[i-1] - sg[mt[i]-1] + MOD) % MOD + (st[i-1] - st[mt[i]-1] + MOD) % MOD,其中sg[i]和st[i]分别表示前i个时间段填黑和填白的方案数的前缀和,mt[i]表示以第i个时间段结尾的最短黑色时间段的左端点。对于ft[i],同理我们有ft[i] = (sg[i-1] - sg[ms[i]-1] + MOD) % MOD + (ss[i-1] - ss[ms[i]-1] + MOD) % MOD,其中sg[i]和ss[i]分别表示前i个时间段填黑和填白的方案数的前缀和,ms[i]表示以第i个时间段结尾的最短白色时间段的左端点。对于g[i],如果我们在第i个时间段结尾填黑,那么前i-1个时间段可以是全填黑、全填白或者有黑有白,所以有g[i] = ((fs[i-1] + ft[i-1]) % MOD + g[i-1]) * (2^(h[i] - h[i-1]) - 2 + MOD) % MOD,其中2^(h[i] - h[i-1]) - 2表示前i个时间段填黑或填白的所有方案数。
这里2^(h[i] - h[i-1]) - 2表示前i个时间段有黑有白的方案数,一共有h[i]-h[i-1]并且每个时间点可以填黑或填白,所以就是2^(h[i] -h[i-1])。-2是要减去全黑和全白的两种情况。最后答案就是fs[hc] + ft[hc] + g[hc]。*/#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 400005, mod = 1e9 + 7;
/*ls,rs:表示填黑时间段的左端点和右端点lt,rt:表示填白时间段的左端点和右端点hc, h: h表示存填白\黑的时间段左右端点,hc表示一共有多少个时间段 * 2 ,注要多存整个时间段(0, k] fs, ft, g:分别表示全填黑、全填白和有黑有白的方案数。 ss,st,sg:分别是全填黑、全填白和有黑有白的前缀和。ms和mt:ms存的是以R(离散化过后)为右端点的最短黑段的L值,mt同理。
*/
int k, n, m, hc;
int ls[N], rs[N], lt[N], rt[N], h[N], ms[N], mt[N];  
int fs[N], ft[N], g[N], ss[N], st[N], sg[N];
int ksm(int a, int b) { // 快速幂 int x = 1;for (; b > 0; b & 1 ? x = 1ll * x * a % mod : 0, a = 1ll * a * a % mod, b >>= 1);return x;
}
inline int m1(int x) { //求余 return x >= mod ? x - mod : x;
}
inline int input() {int x = 0, F = 1;char c = getchar();while (c > '9' || c < '0') {if (c == '-')F = -1;c = getchar();}while (c <= '9' && c >= '0') {x = x * 10 + c - '0';c = getchar();}return x * F;
}
int main() {k = input();n = input();m = input();for (int i = 1; i <= n; i++)ls[i] = input(), rs[i] = input(), h[++hc] = ls[i] - 1, h[++hc] = rs[i];for (int i = 1; i <= m; i++)lt[i] = input(), rt[i] = input(), h[++hc] = lt[i] - 1, h[++hc] = rt[i];h[++hc] = 0;h[++hc] = k;sort(h + 1, h + hc + 1);hc = unique(h + 1, h + hc + 1) - h - 1; // 排序去重 for (int i = 1; i <= n; i++) { // 填黑 int L = lower_bound(h + 1, h + hc + 1, ls[i] - 1) - h, R = lower_bound(h + 1, h + hc + 1, rs[i]) - h;ms[R] = max(ms[R], L + 1); // L,R是相对大小,以R为右端点,存的是最短的区间}for (int i = 1; i <= m; i++) { // 填白 int L = lower_bound(h + 1, h + hc + 1, lt[i] - 1) - h, R = lower_bound(h + 1, h + hc + 1, rt[i]) - h;mt[R] = max(mt[R], L + 1);}g[1] = sg[1] = 1; // 第一天可填黑可填白ms[1] = mt[1] = 1; // ms和mt保存的是第一个时间段为[1, 1]的值for (int i = 2; i <= hc; i++) {ms[i] = max(ms[i - 1], ms[i]); //黑: 这里找一个以i点为右端点的最大左端点mt[i] = max(mt[i - 1], mt[i]);fs[i] = m1(m1(sg[i - 1] - sg[mt[i] - 1] + mod) + m1(st[i - 1] - st[mt[i] - 1] + mod));// 第i段以i结尾的全填黑 ft[i] = m1(m1(sg[i - 1] - sg[ms[i] - 1] + mod) + m1(ss[i - 1] - ss[ms[i] - 1] + mod));g[i] = 1ll * m1(m1(fs[i - 1] + ft[i - 1]) + g[i - 1]) * (ksm(2, h[i] - h[i - 1]) - 2 + mod) % mod;ss[i] = m1(ss[i - 1] + fs[i]);st[i] = m1(st[i - 1] + ft[i]);sg[i] = m1(sg[i - 1] + g[i]);}printf("%d", m1(m1(fs[hc] + ft[hc]) + g[hc]));return 0;
}

2.利用map或unordered_map进行数据离散化 (使用与非区间操作)

常与差分、并查集、DFS等算法结合考察

2.1 邮票 FZU - 2227【DFS】

题目描述

在这里插入图片描述
思路
可以先做映射关系(离散化),然后从最小的数并且这个数出现的次数为1开始dfs,走到哪直接就存到哪。
代码

#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
map<int,int>index,data,num;
vector<int>v[maxn];//邻接表,存相对大小的关系 
int cnt,pos;
int dis[maxn];
bool vis[maxn];
void dfs(int x)
{if(cnt==pos)	return;//int len=v[x].size();for(int i=0;i<2;i++) // 题目保证有解,说明一个顶点最多有两个出度{int y=v[x][i];if(!vis[y]){vis[y]=true;dis[pos++]=data[y];dfs(y);}if(cnt==pos)	return;}
}
int main()
{int n;while(scanf("%d",&n)!=EOF){int ui,vi;cnt=0,pos=0;index.clear();data.clear();num.clear();memset(vis,false,sizeof(vis));for(int i=0;i<2*n;i++)	v[i].clear();while(n--){scanf("%d%d",&ui,&vi);if(!num[ui]) {index[ui]=cnt++;data[index[ui]]=ui;//建立映射关系 (1,100) (100,1) }if(!num[vi]){index[vi]=cnt++;data[index[vi]]=vi;}v[index[ui]].push_back(index[vi]);//建立相对大小的对应关系 v[index[vi]].push_back(index[ui]);num[ui]++;num[vi]++;}int st=0;for(map<int,int>::iterator it=num.begin();it!=num.end();it++){if(it->second==1) //判断是否唯一出现,第一个唯一出现的肯定是字典序最小且起始的位置	{st=index[it->first];break;}}vis[st]=true;dis[pos++]=data[st];dfs(st);for(int i=0;i<cnt;i++){printf("%d",dis[i]);if(i<cnt-1)	printf(" ");else	printf("\n");}}
}

2.2 More is better HDU - 1856 【并查集】

题目描述
在这里插入图片描述
思路:
在集合合并的时,如果两个集合不同,那么在合并成同一个集合的时候,
将被合并的集合里的个数加到这个集合里面,并统计最大值。
坑点:就是当输入n为0时,答案为1,因为当没有朋友对时,各自在自己的房间,所以说答案为1。
代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
map<int, int> mp;
int fa[maxn], num[maxn], ans = 0;
void init(int n){for (int i = 1; i <= n; ++i){fa[i] = i;num[i] = 1;}
}
int find(int x){return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
void _union(int x, int y){x = find(x);y = find(y);if(x != y){num[y] += num[fa[x]];ans = max(ans, num[y]);fa[x] = y;}
}
void solve(){int n, x, y;while (scanf("%d", &n) != EOF){int cnt = 0;ans = 0;init(maxn); mp.clear();if (n == 0){puts("1");continue;}while (n--){scanf("%d%d", &x, &y);if(!mp[x])	mp[x] = ++cnt;if(!mp[y])	mp[y] = ++cnt;_union(mp[x], mp[y]);}printf("%d\n", ans);}
}
int main(){solve();return 0;
}

2.3 金发姑娘和 N 头牛 - 1952. AcWing题库

题目描述
在这里插入图片描述
思路:
在这里插入图片描述
代码

#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>using namespace std;const int INF = 2e9;int n, x, y, z;int main()
{map<int, int> b; // 离散化及差分数组cin >> n >> x >> y >> z;for (int i = 0; i < n; i ++ ){//给三个大区间 + cint l, r;cin >> l >> r;//[-INF,r)b[-INF] += x;b[l] -= x;//[l, r]b[l] += y;b[r + 1] -= y;//b(r, INF]b[r + 1] += z;b[INF] -= z;}int res = 0, sum = 0;// 枚举差分数组,求前缀和,更新最大值for(auto item : b){sum += item.second;// 前缀和res = max(res, sum);}cout << res;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/80216.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命令行快捷键Mac Iterm2

原文:Jump forwards, backwards and delete a word in iTerm2 on Mac OS iTerm2并不允许你使用 ⌥← 或 ⌥→ 来跳过单词。 你也不能使用 ⌥backspace 来删除整个单词。 下面是在Mac OS上如何配置iTerm2以便能做到这一点的方法。 退格键 首先&#xff0c;你需要将你的左侧 ⌥…

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1&#xff09;和弦的实现2&#xff09;和弦级数转为当前调式音阶3&#xff09;根据预置节奏生成伴奏 2. 乐句生成1&#xff09;添加音符2&#xff09;旋律生成3&#xff09;节…

JVM GC ROOT分析

GC root原理:通过对枚举GCroot对象做引用可达性分析,即从GC root对象开始,向下搜索,形成的路径称之为 引用链。如果一个对象到GC roots对象没有任何引用,没有形成引用链,那么该对象等待GC回收,换而言之,如果减少内存泄漏,也就是切断引用链,常见的GCRoot对象如下: 1、…

配置Picgo图床之COS、OSS、Github图床

简介 PicGo是一款开源的图片上传和管理工具&#xff0c;它提供了简单易用的界面和丰富的功能&#xff0c;方便用户上传、管理和分享图片。 以下是PicGo的一些主要特点和功能&#xff1a; 图片上传&#xff1a;PicGo支持将本地图片快速上传到云存储服务&#xff0c;如七牛云、…

深度学习(34)—— StarGAN(1)

深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09;1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…

【bug】记录一次使用Swiper插件时loop属性和slidersPerView属性冲突问题

简言 最近在vue3使用swiper时&#xff0c;突然发现loop属性和slides-per-view属性同时存在启用时&#xff0c;loop生效&#xff0c;下一步只能生效一次的bug&#xff0c;上一步却是好的。非常滴奇怪。 解决过程 分析属性是否使用错误。 loop是循环模式&#xff0c;布尔型。 …

Django之JWT库与SimpleJWT库的使用

Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…

c++--二叉树应用

1.根据二叉树创建字符串 力扣 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 "()" 表示&#xff0c;转化后需要省略所有不影响字符…

SpringBoot集成百度人脸识别实现登陆注册功能Demo(二)

前言 上一篇SpringBoot集成百度人脸demo中我使用的是调用本机摄像头完成人脸注册&#xff0c;本次demo根据业务需求的不同我采用文件上传的方式实现人脸注册。 效果演示 注册 后端响应数据&#xff1a; 登录 后端响应数据&#xff1a; 项目结构 后端代码实现 1、BaiduAiUtil…

SQL 表别名 和 列别名

列表名 列表名之后 order by 可以用别名 也可以用原名&#xff0c; where 中不能用别名的 SQL语句执行顺序&#xff1a; from–>where–>group by -->having — >select --> order 第一步&#xff1a;from语句&#xff0c;选择要操作的表。 第二步&#xff1…

Bug的严重等级和优先级别与分类

一、 Bug的严重等级定义&#xff1a; 1、 Blocker 即系统无法执行、崩溃或严重资源不足、应用模块无法启动或异常退出、无法测试、造成系统不稳定。 严重花屏内存泄漏 用户数据丢失或破坏系统崩溃/死机/冻结模块无法启动或异常退出严重的数值计算错误功能设计与需求严重不符其…

每日一学:什么是 Harbor ?

目录 什么是 Harbor &#xff1f; 一、Harbor 的优势 二、Harbor 架构构成 三、Core services 这是 Harbor 的核心功能 什么是 Harbor &#xff1f; Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Reg…

Spring MVCSpring Boot

文章目录 Spring MVC什么是MVC模式Spring MVC优点SpringMVC 运行流程SpringMVC组件SpringMVC常用的注解有哪些SpringMVC的拦截器和过滤器有什么区别&#xff1f;执行顺序是什么 SpringBoot对SpringBoot的理解Spring和SpringBoot的关系&#xff1f;SpringBoot有哪些核心注解Spri…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

react icon ant简单使用

refer&#xff1a; 文字提示 Tooltip - Ant Design 1.首先保证已经引入了Ant 2.在组件&#xff08;页面&#xff09;引入tooltip import { Form, Tooltip } from antd; 3.在合适的位置使用tooltip&#xff1a; <span>寿命 <Tooltip title"这是寿命的说明&quo…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

【Linux】计算机网络的背景和协议分层

文章目录 网络发展协议何为协议网络协议协议分层OSI七层模型TCP/IP五层模型&#xff08;四层&#xff09; 基本通信流程mac地址和ip地址网络通信本质 网络发展 从一开始计算机作为一台台单机使用&#xff0c;到现在网络飞速发展&#xff0c;从局域网Lan建立起局域网&#xff0…

Vue3 第四节 自定义hook函数以及组合式API

1.自定义hook函数 2.toRef和toRefs 3.shallowRef和shallowReactive 4.readonly和shallowReadonly 5.toRaw和markRaw 6.customref 一.自定义hook函数 ① 本质是一个函数&#xff0c;把setup函数中使用的Composition API 进行了封装,类似于vue2.x中的mixin 自定义hook函数…

TCP和UDP

目录 TCP和UDP是什么&#xff1f; TCP和UDP有什么区别? 三次握手和四次挥手 TCP维护可靠的通信方式 拥塞控制 滑动窗口的原理 什么是粘包以及粘包的原因 粘包的处理方式 TCP和UDP使用场景 TCP和UDP是什么&#xff1f; TCP&#xff1a; 传输控制协议&#xff08;TCP&am…

Maven介绍-下载-安装-使用-基础知识

Maven介绍-下载-安装-使用-基础知识 Maven的进阶高级用法可查看这篇文章&#xff1a; Maven分模块-继承-聚合-私服的高级用法 文章目录 Maven介绍-下载-安装-使用-基础知识01. Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型…