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

蓝桥杯备考:红黑树与map和set

搜索二叉树

我们三种树只了解原理,不写代码,因为我们竞赛不做要求,只是为了使用set和map做铺垫

原理记不住,没关系,我们只要会各种操作的时间复杂度

二叉搜索树的定义 1°若左子树非空,左子树所有结点的权值小于根结点的权值

2°若右子树非空,右子树所有结点的权值大于根结点的权值

3°左右子树都是一颗二叉搜索树

简单来说 左<根<右

所以二叉搜索树的中序遍历的结果是从小到大

2   5   6  8  11  18  26

第一个操作:查找(二叉搜索树最本质的东西)

根据BST的特性,从根节点开始一路向下找

比如我们要查找一个6 

6比11小,所以我们从左子树向下继续找,6比5大,所以我们从5的右子树向下找,6比8小 我们从8的左子树向下找,

查找失败的案例:查找24

所以我们当我们的结点分布的均匀的话 二叉搜索树的时间复杂度应该就是树高 也就是logN,是一个非常优秀的时间复杂度

插入:和查找操作差不多

比如我们插入一个10,我们通过不断查找到空位置的时候就把10插进去

所以我们的插入操作也是logN的时间复杂度

构建二叉搜索树

插入第一个数,第二个数和10比较应该是小于10的所以放在左子树

插入第三个数8 8比10小,所以去左子树,8比5大 所以放在5的右孩子的位置接下来看18 18比10大 放在右子树

接下来是11 11比10大 去右子树 比18小 放在18的左孩子上   

接下来是2 2比10小 进入10的左孩子 2比5小 把2放在5的左孩子

接下来插入26  26比10大,进入右子树,比18大,放在18的右子树

接下来插入6 6比10小 进入左子树 比5大 进入右子树 比8小 放在8的左子树

这是正常的二叉搜索树,每个结点构建的时间复杂度基本就是logN

但是我们也要考虑一些极端的情况

6在2的右子树,8比2大进入右子树 8比6大放在6的右孩子的位置

10也是放在8的右孩子的位置,这种情况就是极端情况了,它插入每个结点的时间复杂度和单链表差不多 是N级别的复杂度,所以这时候我们就需要有平衡二叉树的东西了

删除操作

删除操作分为3种情况 1°删除的结点是叶子结点

2°删除的结点只有左子树或者右子树

3°删除的结点既有左子树又有右子树

1°删除叶子结点 我们的策略很简单,直接删除,因为删除这个结点不影响二叉搜索树的性质

比如这个搜索树,我们要删除5这个结点,5是有右子树的,由于左子树的所有值都比根结点要小,我们把8替换到5这个位置是不影响搜素破二叉树的性质的,

所以我们的结果就是

第三种情况 就是删除的结点既有左子树和右子树

比如我们删除10这个结点 左右子树都有,这时候我们有两个策略,第一种策略就是把左子树最大的结点和根结点进行替换,然后删除这个大结点,比如如图最大的结点是8 我们把根结点换成8 然后删除左子树的8,左子树的8是一个只有左子树的结点,直接把6结点上移

这一切的前提就是因为左子树最大的那个结点是一定一定没有右子树的

而且左子树最大的结点换到根结点,这个根结点是一定大于左子树小于右子树的

我们的第二种策略就是把右子树最小的结点换到根结点,然后删除这个结点,也是符合搜索树的性质的

我们要学一个特殊的东西,我们原来的二叉搜索树中序遍历之后就是 2 5 6 8 10 11 18 26

我们删除10结点,用的是它的前驱结点8或者后继结点11来替换它,

我们创建二叉树并不是为了排序,而是为了插入查找数据

如果BST不是极端情况,那么它的这些操作时间复杂度都是logN是很低的

但是二叉搜索树毕竟是不能阻止极端情况发生的

所以我们后面要学习平衡二叉树

平衡二叉树

平衡二叉树也叫avl树 本质也是一种二叉搜索树

它的性质1° 左右子树的高度差绝对值不超过1

2°每个子树都是平衡二叉树

左边这棵树平衡因子的绝对值不超过1 是平衡二叉树         右边这棵树平衡因子超过1 不是平衡二叉树

平衡二叉树的查找 插入 删除和搜索二叉树基本上是一致的,只不过对于失衡它会进行调整

处理失衡的操作

左旋操作(以右孩子为轴向左旋转)

这种失衡,我们就要进行左旋操作因为根结点是小于右子树的所有结点的,我们把根结点变成右孩子的左子树,是没问题的没毛病的 经过我们的左旋,我们的树既符合搜索树,又变得平衡了

接下来我们来处理一下复杂的左旋,当我们左旋时右孩子存在左子树时,我们就把根结点左旋过来,把那个左子树变成原来根结点的右子树

右旋操作

如果右旋的时候,左孩子的右子树是有结点的,那我们就把根结点右旋到右子树然后把左孩子原来的右子树变成根节点的左孩子就行了

插入操作

我们因为插入导致失衡的话,失衡的结点一定只可能是2或者-2,我们只需要调整一下最小不平衡子树,那么这颗子树所有的失衡结点都会向0靠近一位,我们的工作就完成了

我们的插入要分为四种情况

LL型

如果插入的结点位于最小失衡树的 根结点的左孩子的左子树上,我们只需要右旋我们的根节点就好了 

RR型

如果插入的结点位于最小失衡树的右孩子的右子树上,这时候我们就左旋一下最小失衡树的根结点

LR型

如果插入的元素位于左孩子的右子树上,我们就先左旋左孩子,再右旋根结点

RL型

如果插入的元素位于右孩子的左子树上,我们就先右旋右孩子,再左旋根结点

构建平衡树

依次插入15,10,6

插入6的时候 15这个结点的平衡因子是2 插入结点是左孩子左子树,我们要右旋一下失衡结点

接下来继续插入 18,12,13

13插入进去之后 10这个结点平衡因子就是-2,插入结点位于右孩子左子树,先右旋右孩子,再左旋根节点

接下来继续插入8导致10这个结点失衡

插入位置再左孩子的右子树,先左旋左孩子,再右旋根结点

接下来插入20,17,插入到28时15这个结点失衡,插入位置在右孩子右子树,左旋根节点15就完成了

构建完毕,接下来我们来简单了解一下删除操作

删除操作

删除结点的操作和平衡二叉树是一致的,删除完之后我们要找到最小不平衡子树,看它的最高儿子结点是左还是右,左就是L 右就是R 再看最高孙子结点是左是右,来判断旋转类型

当我们删除6这个结点,8结点是第一课不平衡子树的根结点,失衡因子是-2,最高儿子结点在右子树,最高孙子结点在左子树  所以是RL型,先右旋右孩子,再左旋根节点

紧接着,12这课树也是不平衡子树,最高儿子结点在右子树,最高孙子结点也在右子树,我们只要左旋根节点就行了

如此,删除完毕,接下来我们学红黑树

红黑树

红黑树是一个效率更高的树,

红黑树是什么样的树 1°在二叉搜索树的基础上,给每个结点赋予红或者黑的颜色

2° 由于最长的路径不高于最短路径的两倍,所以这是一颗接近平衡的搜索树

红黑树牺牲了一部分平衡性来换取 插入/删除时的旋转操作少量,整体来说性能是高于AVL树的

红黑树的规则:左根右(就是搜索树的性质)

根叶黑 (根结点和叶子结点都是黑色的)

不红红  红色结点不能连续存在

黑路同  每条路径黑色结点个数相同

此时,这棵树是符合左根右,根叶黑,不红红三条性质的,

但是 !每条路径黑色结点个数不全是相同的

最长路径是不会超过最短路径的两倍的

比如我们简单证明一下

假设最短路径是三个黑色结点,那最长路径为了符合不红红,根叶黑,黑路同的性质,最长路径一定是5 如图

所以说最长路径一定不超过最短路径的两倍

通过这个性质,能推出h<= 2 * log(n+1),我们的各种操作都是log级别的时间复杂度

红黑树的插入

首先我们插入的元素默认是红色的,因为如果我们插入黑色结点,那么为了黑路同的性质,我们要调整的路径会特别多

比如如图插入的是黑色结点

插入的那条路径黑色结点变多了,我们就要调整其他所有路径和他一样,我们不要这样,所以我们默认都插入红色结点,这样他只会影响不红红和根叶黑的性质

插入结点后 如果红黑树的性质被破坏,我们会分为三种情况

1°插入结点是根结点

---》直接变黑

2°插入结点的叔叔是红色

如果插入结点的叔叔是红色结点的话,我们要把叔父爷的结点变色,然后把爷爷结点当作插入结点处理

如图这是我们变色后的结果,最后我们把8结点当做插入结点,因为他是根结点,直接变成黑色就行了

3°插入结点的叔叔是黑色

如果插入结点的叔叔是黑色结点,那我们就有几种策略来处理了

也就是我们需要(LLor LR or RR or RL)旋转 然后变色处理来解决

1°LL旋转

如图插入结点在根结点的左孩子的左子树,所以我们是LL型的,这时候我们就右旋根结点然后变换旋转中心和旋转结点的颜色即可

2°LR旋转

当我们插入结点是在左孩子的右子树的时候,我们就先左旋左孩子,再右旋根结点,再变换旋转结点和旋转中心结点的颜色

如图这种情况就是插入结点位于左孩子的右子树上,我们先左旋左孩子,再右旋根结点后变色

3° RR旋转

如图这种就是RR型,我们只需要左旋根结点变换颜色就好了

4°RL旋转

RL就是先右旋右孩子,再左旋左孩子,再变色

构建红黑树

先插入根结点18,由于他是根,我们直接把它变成黑色

接下来我们插入19,插入19是不影响红黑树的性质的,我们继续插入24

当我们24插进去的时候,触犯了我们不红红的性质,我们看到24的叔叔结点是黑色的,插入位置再右孩子右子树,我们左旋爷爷结点就行啦

接下来我们插入35,违反了不红红,插入结点的叔叔是红结点,我们只需要变换爷叔父结点的颜色就行了,又因为爷爷结点是根结点,所以爷爷结点再换回黑色

接下来插入28,又违反了不红红,叔叔结点是黑色结点,

插入16,不影响红黑树的性质

然后插入10

插入10的时候,10的叔叔是黑色结点,所以我们只需要右旋爷爷结点就行了

接下来插入7,叔叔结点是红结点

我们只需要改变叔叔爷爷父亲结点的颜色,然后把爷爷结点当成插入结点继续操作就行

接下来我们插入9这个结点

叔叔结点是黑色结点,LR型,先左旋左孩子,再右旋10这个爷爷结点

接下来插入6这个结点

6的叔叔结点是红色,我们只需要变换6的爷爷父亲叔叔结点的颜色然后把爷爷结点当作插入结点

接下来把9这个结点再当成插入结点把9的爷爷进行右旋

接下来我们再插入26这个结点

26这个结点的叔叔也是红结点,我们只需要把叔叔爷爷父亲结点变换颜色把爷爷结点当成插入结点就行了

28叔叔还是红结点,继续进行方才的操作

红黑树构建完毕!!!

set/multiset

set是我们C++里面已经实现好的红黑树的容器,set不能存储重复元素,multiset可以存储重复元素,有时候我们能用set进行去重

接口 size:返回元素个数 ,时间复杂度是O(1) empty 判空 时间复杂度也是O(1)

begin/end 迭代器,我们遍历set的元素的时候是按中序遍历进行的,返回的是一个有序的序列

insert 向红黑树插入一个元素,时间复杂度是logN级别的

查找有 find/count  区别就是find返回的是迭代器,count返回的是一个元素出现的个数,时间复杂度都是logN级别

lower_bound 查找大于等于x的最小元素。upper_bound 查找大于x的最小元素

我们来用代码实现一下

这是我们构建红黑树和遍历红黑树的过程

这是我们测试count和erase接口,由于find接口要返回一个迭代器,我们很少用find 都用count

这是测试lower_bound 和upper_bound 接口

总代码如下

#include <iostream>
#include <set>using namespace std;
int a[] = { 10, 60, 20, 70, 80, 30, 90, 40, 100, 50 };
int main()
{set <int> mp;for (auto e : a){mp.insert(e);}for (auto e : mp){cout << e << " ";}cout << endl;/*if (mp.count(1)) cout << "1" << endl;if (mp.count(30)) cout << "30" << endl;if (mp.count(60)) cout << "60" << endl;mp.erase(30);if (mp.count(30))cout << "30" << endl;elsecout << "不存在30" << endl;*/auto x = mp.lower_bound(20);auto y = mp.upper_bound(20);cout << *x << " " << *y << endl;return 0;
}

map/multimap

我们已经学了set,map就是在set的基础上,多了一个关键字,它的每个元素都绑定着一个值

在学习map之前,我们先给出两个场景

场景1:判断一堆字符串中,某一个字符是否出现过

这种情况,我们可以一个set来解决

场景2:判断一堆字符串中,某一个字符串出现的次数

这时候,我们就必须要用map了,map<string,int>来绑定上每个字符串出现的个数

我们的map红黑树里每个元素存储的pair类型的元素 pair<key,value> 这个也特别像我们在python里学的字典

我们可以这样理解,我们的map里存储的每个元素都是一种结构体,然后我们插入查找的时候比较的是key,每个key绑定着一个value值

可以是map<int,int>判断每个数字出现的次数

可以是map<string,int>判断每个字符串出现的次数

可以是map<string,string>表示字符串替换

也可以是map<int,vector<int>>表示很多树

我们map的接口和set是差不多的

size和empty时间复杂度和set一样的都是O(N)

insert插入元素,注意我们这里插入的是pair类型,比如insert({1,2}),时间复杂度是logN

operator[] 这个运算符重载使得我们能像数组一样查询map的元素,我们的下标就是key,查询的结果就是value的值

其他的erase,find/count和set是一样一样的 时间复杂度都是常数级别

测试插入

我们可以看到,打印的时候是按照字典序打印的

这是我们重载的方括号,和数组用法是一样的

我们需要注意的一点就是,我们的方括号重载有可能会向我们的map里插入我们本不想插入的元素,比如

刘强自动被我们创建了,并且它的初始值是0

然后我们想规避这种插入的话,就需要在判断相等之前先判断这个元素是否存在

好的,最后我们就来实现一下查找一堆字符串中某个字符串出现次数的代码吧

#include <iostream>
#include <map>
using namespace std;void print(map<string, int>& t)
{for (auto e : t){cout << e.first <<" " <<  e.second << endl;}
}
map <string, int> mp;
void fun()
{string s;for (int i = 1; i <= 10; i++){cin >> s;mp[s]++;}print(mp);
}
int main()
{fun();	//map<string, int> mp;//mp.insert({ "张三",1 });//mp.insert({ "李四",2 });//mp.insert({ "王五",3 });//print(mp);///*print(mp);//cout << mp["张三"] << endl;//mp["张三"] = 110;//cout << mp["张三"] << endl;*///if (mp.count("刘强") && mp["刘强"] == 3) cout << "yes" << endl;//else cout << "no" << endl;//print(mp);return 0;
}

set和map算法题

1.英语作文问题

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <map>
using namespace std;
bool check(char ch)
{if (ch == ' ' || ch == ',' || ch == '!' || ch == '?' || ch == '.')return false;return true;
}int main()
{int n, p;cin >> n >> p;map <string, int> mp;while (n--){string t;int tmp;cin >> t >> tmp;mp.insert({ t,tmp });}char ch;int sum = 0;string ret;scanf("%c", &ch);while (scanf("%c", &ch) != EOF){if (check(ch)) ret += ch;else {sum += mp[ret];ret = "";}}cout << sum%p << endl;return 0;
}
2.营业额统计

我们的思路就是先把第一天的营业额作为最小波动值放到set里,然后不断利用lower_bound找最接近的值求最小差加到和里面就行了,找最近的值就先用lowerbound找到最小的比这个数大的值,再找最大的比这个数小的值,比较出差值最小的,就是最小波动值,当然这个过程也有可能会越界,我们要处理一下边界情况

#include <iostream>
#include <set>
#include <cmath>
using namespace std;
const int INF = 1e7+10;
set<int> mp;
int sum = 0;
int main()
{mp.insert(-INF);mp.insert(INF);int n;cin >> n;int ret;cin >> ret;mp.insert(ret);sum+=ret;for(int i = 2;i<=n;i++){int ret; cin >> ret;auto it = mp.lower_bound(ret);auto tmp = it;tmp--;int r = min(abs(*it-ret),abs(*tmp-ret));sum+=r;mp.insert(ret);}cout << sum << endl;
}
3.木材仓库
#include <iostream>
#include <set>
using namespace std;
typedef long long ll;
const ll INF = 1e10+10;int main()
{set <ll> mp;int n;cin >> n;mp.insert(-INF);mp.insert(INF);while(n--){int op;cin >> op;if(op == 1){int t;cin >> t;if(mp.count(t)) cout << "Already Exist" << endl;else mp.insert(t);}else{int t;cin >> t;if(mp.size()== 2) cout << "Empty" << endl;else{auto it = mp.lower_bound(t);auto tmp = it;tmp--;if(*tmp-t <= *it -t){cout << *tmp << endl;mp.erase(*tmp); }else{cout << *it << endl;mp.erase(*it);}				}}}return 0;
}

这道题和上一道题非常之相似

相关文章:

蓝桥杯备考:红黑树与map和set

搜索二叉树 我们三种树只了解原理&#xff0c;不写代码&#xff0c;因为我们竞赛不做要求&#xff0c;只是为了使用set和map做铺垫 原理记不住&#xff0c;没关系&#xff0c;我们只要会各种操作的时间复杂度 二叉搜索树的定义 1若左子树非空&#xff0c;左子树所有结点的权…...

第二届生成式人工智能与信息安全国际学术会议(GAIIS 2025)

在线投稿&#xff1a; 学术会议-学术交流征稿-学术会议在线-艾思科蓝 【征文主题】&#xff08;包括但不限于&#xff09; 深度学习 自然语言处理 算法应用 计算机视觉 视觉识别 模式识别 强化学习 生成对抗网络 生成建模技术 语言预训练 视觉预训练 联合预训练…...

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…...

Python 常用运维模块之OS模块篇

Python 常用运维模块之OS模块篇 OS 模块获取当前工作目录更改当前工作目录返回当前目录路径返回上一级目录路径递归生成目录路径删除目录创建目录删除目录列出特定目录下文件和子目录删除某个特定文件重命名某个文件获取某个文件/目录的信息输出目录路径分隔符输出文件行终止符…...

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝&#xff0c;2024年已经来临&#xff0c;回顾过去一年&#xff0c;科技的迅猛进步简直让人目不暇接。 在人工智能&#xff08;AI&#xff09;越来越强大的今天&#xff0c;我们不再停留在幻想阶段&#xff0c;量子计算的雏形开始展示它的无穷潜力&#xff0c;Web …...

HTML语言的数据结构

HTML语言的数据结构 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的标准语言。尽管HTML本身不是一种编程语言&#xff0c;它为我们提供了一种结构化的信息表示方法&#xff0c;使得网页内容能够有序地展现给用户。HTML的核心在于其标记&#xff08;标签&#…...

怎么创建一个能在线测试php的html5网页?

代码示例&#xff1a; 一、搭建服务器环境 首先&#xff0c;你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器&#xff0c;可以使用 Apache 或 Nginx 作为 Web 服务器&#xff0c;并安装 PHP 解释器。对于 Windows 服务器&#xff0c;可以使用 WAMP&#xff08…...

docker安装elk6.7.1-搜集nginx-json日志

docker安装elk6.7.1-搜集nginx-json日志 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 0.规划 192.168.171.130 nginxfilebeat 192.168.171.131 …...

常见的社交媒体平台有哪些?

社交媒体平台有哪些&#xff1f;在跨境电商和全球营销的过程中&#xff0c;海外社交媒体平台是提高品牌曝光率的重要工具。为了有效管理多个平台的账户&#xff0c;并防止账户之间的关联问题&#xff0c;OKBrow指纹指纹浏览器凭借其强大的多账户管理、防关联技术和隐私保护功能…...

nslookup在内网渗透的使用

1. 什么是 nslookup&#xff1f; nslookup&#xff08;Name Server Lookup&#xff09;是一个用于查询 DNS&#xff08;域名系统&#xff09;记录的命令行工具。通过该工具&#xff0c;用户可以查询域名的解析结果&#xff0c;例如获取某个域名对应的 IP 地址或查找域名的相关记…...

Linux:修改用户名

Linux&#xff1a;修改用户名 0. 注意事项1.创建并切到临时用户tempuser2.更改用户名3.删除临时用户tempuser 更多内容&#xff1a;XiaoJ的知识星球 在Ubuntu系统中&#xff0c;更改用户名。 0. 注意事项 备份重要数据&#xff1a;在更改用户名之前&#xff0c;建议备份重要数…...

IP协议特性

在网络层中&#xff0c;最重要的协议就是IP协议&#xff0c;IP协议也有两个特性&#xff0c;即地址管理和路由选择。 1、地址管理 由于IPv4地址为4个字节&#xff0c;所以最多可以支持42亿个地址&#xff0c;但在现在&#xff0c;42亿明显不够用了。这就衍生出下面几个机制。…...

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网&#xff1a;https://nodejs.org/zh-cn/download 点击【下载】&#xff0c;选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...

14_音乐播放服务_字典缓存避免重复加载

首先在游戏根入口下创建空节点 F2重命名为BGAudio 作为播放 背景音乐的对象 在BGAudio对象上挂载组件 AudioSource 关掉PlayOnAwake 因为我们需要通过代码来控制音效 音量大小设置为0.5 Ctrl d 再复制一份背景播放对象BGAudio 重命名为UIAudio 作为UI窗口操作的播放对象 创建…...

pgsql中处理数组类型字段

1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...

新年好(Dijkstra+dfs/全排列)

1135. 新年好 - AcWing题库 思路&#xff1a; 1.先预处理出1,a,b,c,d,e到其他点的单源最短路&#xff0c;也就是进行6次Dijkstra 2.计算以1为起点的这6个数的全排列&#xff0c;哪种排列方式所得距离最小&#xff0c;也可以使用dfs 1.Dijkstradfs #define int long longusing …...

vscode导入模块不显示类型注解

目录结构&#xff1a; utils.py&#xff1a; import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…...

Stable diffusion 都支持哪些模型

Stable Diffusion 支持多种模型&#xff0c;主要包括以下几类&#xff1a; 官方基础模型&#xff1a; SD 1.x 系列&#xff08;如 Stable Diffusion 1.4、1.5&#xff09;&#xff1a;这是最经典的模型&#xff0c;适合多种通用场景&#xff0c;使用简单且易于上手。SD 2.x 系列…...

C语言操作符(上)

操作符 一&#xff0c;操作符的分类1&#xff0c;算数操作符2&#xff0c;赋值操作符3&#xff0c;逻辑操作符4&#xff0c;条件操作符4&#xff0c;单目操作符5&#xff0c;函数调用和下表访问操作符 二&#xff0c;原码反码补码三&#xff0c;移位操作符1&#xff0c;左移操作…...

Linux TCP 之 RTT 采集与 RTO 计算

我们来看看 Linux TCP 采集 RTT 的函数 tcp_rtt_estimator&#xff0c;看注释&#xff0c;充满了胶着。 但在那个谨慎的年代&#xff0c;这些意味着什么&#xff1f; RTT 最初仅用于 RTO 的计算而不是用于调速&#xff0c;RTO 的计算存在两个问题&#xff0c;如果过估&#x…...

智慧水务管网在线监测平台(Axure高保真原型)

智慧水务管网在线监测平台是一种集成了物联网、大数据、云计算和人工智能等技术的综合管理系统。平台的主要目的是提高水务管理的效率和安全&#xff0c;确保供水系统的稳定运行。 智慧水务管网在线监测平台的主要特点和功能&#xff1a; 综合监测与管理&#xff1a;智慧水务平…...

Kubernetes 架构图和组件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;历代文学&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;高并发设计&#xf…...

不建模,无代码,如何构建一个3D虚拟展厅?

在数字化浪潮的推动下&#xff0c;众多企业正积极探索线上3D虚拟展厅这一新型展示平台&#xff0c;旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而&#xff0c;构建一个既专业又吸引人的3D虚拟展厅并非易事&#xff0c;它不仅需要深厚的技术支持&#xff0c;还需…...

MMDetection学习系列(5)——Mask R-CNN深度探索与实战指南

目录 实例分割 R-CNN系列 R-CNN Fast R-CNN Faster R-CNN Mask R-CNN Mask R-CNN 头部结构细节 两阶段架构 损失函数 掩码 RoIAlign Faster R-CNN中的RoIPool Mask R-CNN 中的RoIAlign 实例分割实验 消融研究 定性结果 SOTA 方法比较 Coovally AI模型训练与…...

Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析

目录 前言1. TRANSLATE2. REGEXP_LIKE3. 实战 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. TRANSLATE TRANSLATE 用于替换字符串中指定字符集的每个字符&#xff0c;返回替换后的字符串 逐一映射输入字…...

PHP语言的软件工程

PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支&#xff0c;它涉及软件的规划、开发、测试和维护。在现代开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...

量变引起质变

量变引起质变&#xff0c;这个是最本质的规律&#xff0c;重复进行一件事情&#xff0c;这件事情就会越来越完善&#xff0c;越来越完美&#xff0c;哪怕是菜鸟&#xff0c;重复多了就是大佬。 我从说话结结巴巴&#xff0c;到说话流畅&#xff0c;只是用了15天直播写代码&…...

【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中&#xff0c;制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动&#xff0c;旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...

Linux内核 -- Linux 的 BIO框架

深入理解 Linux 的 BIO 在 Linux 内核中&#xff0c;BIO&#xff08;Block I/O&#xff09;是块层&#xff08;block layer&#xff09;用于描述块设备 I/O 请求的核心数据结构。它在文件系统与块设备驱动程序之间充当“载体”&#xff0c;负责把数据页及相关元数据从上层提交…...

Spring WebFlux 和 Spring MVC 的主要区别是什么?

Spring WebFlux 和 Spring MVC 都是 Spring 框架中用于构建 Web 应用的模块&#xff0c;但它们在设计理念、编程模型、性能特性等方面存在显著区别。以下是它们的主要区别&#xff1a; ### 1. **编程模型** - **Spring MVC**&#xff1a; - **同步和阻塞**&#xff1a;Spri…...

卸载和安装Git小乌龟、git基本命令

卸载 Git 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中&#xff0c;选择“程序”或“程序和功能”。 查找并卸载 Git&#xff1a; 在程序列表中找到“Git”或“Git for Windows…...

正向代理与反向代理的主要区别

正向代理与反向代理的主要区别 正向代理与反向代理都是中间服务器 特性正向代理反向代理位置客户端和目标服务器之间客户端和后端服务器之间客户端感知客户端知道代理的存在&#xff0c;并主动连接代理客户端不知道代理的存在&#xff0c;认为直接连接目标服务器主要用途隐藏…...

vue组件学习三(插槽)

目录 1、匿名插槽2、渲染作用域3、默认内容4、具名插槽5、条件插槽6、作用域插槽7、具名作用域插槽最后 1、匿名插槽 父组件调用Mycomponet1组件 <Mycomponet1>click me </Mycomponet1>子组件为 <button><slot></slot> </button>最后结…...

Django 的 `Meta` 类和外键的使用

Django 的 Meta 类和外键的使用 1. Meta 类的常用选项2. 外键&#xff08;ForeignKey&#xff09;字段的使用2.1 基本用法2.2 ForeignKey 参数2.3 外键删除选项&#xff08;on_delete&#xff09; 3. 外键和查询3.1 获取作者的所有书籍3.2 通过书籍查找作者3.3 使用 select_rel…...

DP动态规划字典版递归

https://blog.csdn.net/m0_74408723/article/details/145303575?spm1001.2014.3001.5501 一只青蛙&#xff0c;可以一次跳上1级台阶&#xff0c;也可以一次跳上2级台阶。求这只青蛙跳10级台阶有多少种跳法&#xff1f; 优化上一篇青蛙跳台阶问题。可以采用Map字典存放f(n-1)f(…...

图论 八字码

我们可能惊异于某些技巧。我们认为这个技巧真是巧妙啊。或者有人认为我依靠自己的直觉想出了这个表示方法。非常自豪。我认为假设是很小的时候&#xff0c;比如说小学初中&#xff0c;还是不错的。到高中大学&#xff0c;就有一些不成熟了。因为这实际上是一个竞技。很多东西前…...

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code&#xff08;简称VSCode&#xff09;是一个功能强大的开源代码编辑器&#xff0c;广泛用于各种编程语言和开发场景&#xff0c;本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法&#xff0c;使用过程中的技巧 文章目录 扩展安装失败调试配…...

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像&#xff0c;换背景色。 1&#xff0c;如何在Excel中抠图头像&#xff0c;换背景色 大家都知道在PS中可以很容易抠图头像&#xff0c;换背景色&#xff0c;其实Excel中也可以抠简单的图&#xff0c;换背景色。 ※所用头像图片为百度搜索&#x…...

vue项目动态div滚动条滑动到指定位置效果

标题首先我们得明确几个知识点 element.scrollIntoView this.$el.querySelector 文档对象模型Document引用的 querySelector() 方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项&#xff0c;则返回null。 用来匹配动态document 代码 // t…...

2K高刷电竞显示器怎么选?

2K高刷电竞显示器怎么选&#xff1f;哪个价格适合你&#xff1f;哪个配置适合你呢&#xff1f; 1.HKC G27H2Pro - 2K高刷电竞显示器怎么选 外观设计 - HKC G27H2Pro 2K高刷电竞显示器 电竞风拉满&#xff1a;作为猎鹰系列的一员&#xff0c;背部 “鹰翼图腾” 切割线搭配炎红…...

Codeforces Round 1000 (Div. 2)-C题(树上两个节点不同边数最大值)

https://codeforces.com/contest/2063/problem/C 牢记一棵树上两个节点如果相邻,它们有一条边会重叠,两个节点延伸出去的所有不同边是两个节点入度之和-1而不是入度之和,那么如果这棵树上有三个节点它们的入度都相同,那么优先选择非相邻的两个节点才能使所有不同边的数量最大!!…...

【2024年华为OD机试】 (E卷,200分) - 寻找符合要求的最长子串(JavaScriptJava PythonC/C++)

一、问题描述 给定一个字符串 s&#xff0c;找出满足以下条件的最长子串&#xff1a; 任意一个字符最多出现2次&#xff1a;子串中的每个字符在子串中出现的次数不能超过2次。子串不包含指定字符&#xff1a;子串不能包含输入的指定字符。 请找出满足该条件的最长子串的长度…...

c++常见设计模式之装饰器模式

基础介绍 装饰器模式是结构型设计模式&#xff0c;从字面意思看装饰器设计模式就是用来解决在原有的实现基础上添加一些额外的实现的问题。那么正统的概念是什么呢&#xff1f;装饰器模式允许我们动态的向对象添加新的 行为&#xff0c;同时不改变其原有的结构。它是一种比继承…...

如何在Python中进行数据分析?

数据分析是现代数据科学中的核心环节之一&#xff0c;它能够帮助我们从数据中提取有价值的信息&#xff0c;并为决策提供依据。在Python中&#xff0c;进行数据分析非常方便&#xff0c;因为Python有着丰富的库和工具&#xff0c;能够帮助处理和分析各种类型的数据。本篇文章将…...

linux网络 | 传输层TCP | 认识tcp报头字段与分离

前言&#xff1a; 本节内容继续传输层的讲解&#xff0c; 本节讲解的是tcp协议。 tcp协议是我们日常中最常用的协议。就比如我们浏览网页&#xff0c;我们知道网页时http或者https协议。 其实http或者https底层就是用的tcp协议。tcp协议&#xff0c;全名又称为传输控制协议&…...

定位,用最通俗易懂的方法2.1:CRLB实例

二郎就不设置什么VIP可见啥的了&#xff0c;这样大家都能看到。 如果觉得受益&#xff0c;可以给予一些打赏&#xff0c;也算对原创的一些鼓励&#xff0c;谢谢。 钱的用途&#xff1a;1&#xff09;布施给他人&#xff1b;2&#xff09;二郎会有更多空闲时间写教程 起因&…...

深入内核讲明白Android Binder【三】

深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …...

vim如何显示行号

:set nu 显示行号 :set nonu 不显示行号...

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法&#xff0c;特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵&#xff0c;然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤&#xff1a; [精确算法] 列主元高斯消元法 步骤 1&am…...

T-SQL语言的数据库编程

T-SQL语言的数据库编程 1. 引言 在信息化迅速发展的今天&#xff0c;数据库已经成为数据管理和使用的重要工具。其中&#xff0c;T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server的扩展SQL语言&#xff0c;不仅用于数据查询和管理&#xff0c;还能够进行复杂的…...