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

AVL 树

1.AVL树的概念

AVL树是最先发明的自平衡二叉查找树,AVL树可以是一棵空树,或者具有以下性质的树:左右子树都是AVL树。且左右子树的高度差的绝对值不超过1。
AVL树是一颗高度平衡搜索二叉树,通过控制高度去控制平衡。

AVL树的发明者是G. M. Adelson-Velsky和E. M. Landis,故命名为AVL树,他们在1962年的论文《An algorithm for the organization of information》中提到了AVL树的概念。

为了方便观察和控制树是否平衡,引入一个叫做平衡因子的概念,每一个结点都有一个平衡因子,任何结点的平衡因子等于右子树高度 - 左子树高度,结合AVL树中左右子树高度绝对值不超过1的特点,可以得出,任何结点的平衡因子等于 -1、0、1,不会是其他值(AVL树不一定必须要平衡因子,只是为了便于观察)。

AVL树是高度平衡搜索二叉树,要求的高度差是不超过1,按道理来说要求高度差是0,会更平衡,这里是因为这样的想法在有些情况下实现不了,比如说只有2个结点的时候,4个结点的时候,高度差无法做到是0,最好的情况下就是1。

AVL树整体结点数量分布和完全二叉树完全类似,高度可以控制在logN,其增删查改的效率也可以控制在O(logN),相比起二叉搜索树就有了质的提升。

2.AVL树的实现

2.1AVL树的结构

template<class K, class V>
struct AVLTreeNode
{AVLTreeNode(pair<K, V> kv):_bf(0),_parent(nullptr),_left(nullptr),_right(nullptr),_kv(kv){}int _bf;// 平衡因子AVLTreeNode* _parent;// 需要建立子结点和父结点的联系AVLTreeNode* _left;AVLTreeNode* _right;pair<K, V> _kv;
};
template<class K,class V>
class AVLTree
{typedef AVLTreeNode<K, V> Node;
public:private:Node* _root = nullptr;
};

2.2AVL树的插入

2.2.1插入的大概过程

插入的过程稍微有点复杂,先来看看大概的过程,然后再细分讨论

  1. AVL树的插入和搜索二叉树按照相同的规则插入,都是小的值往左边插入,大的值往右边插入。
  2. 新增结点以后,只会影响祖先结点的高度,换句话说,可能会影响到部分祖先结点的平衡因子,所以更新结点的平衡因子最坏情况下要更新到根结点有些情况下更新到中间就可以停止,具体情况插入的时候分析讨论
  3. 更新平衡因子过程中没有出现问题(也就是平衡因子都是平衡的),则插入结束
  4. 更新平衡因子过程中出现不平衡,对不平衡子树进行旋转,旋转的作用就是调节平衡,同时可以降低子树的高度,旋转后不会影响上一层,就插入结束

2.2.2平衡因子的更新

平衡因子的更新原则是:

  • 只有子树高度变化才会影响当前结点平衡因子;
  • 新增结点在parent的右子树,parent的平衡因子 ++
  • 新增结点在parent左子树,parent平衡因子 --
  • parent所在的子树的高度是否变化决定了是否要继续向上更新

更新停止的条件:

  • 若更新后parent的平衡因子等于0,那么更新中parent的平衡因子变化情况就只有两种:-1--->0或者1--->0,说点明更新前parent的子树一边高一边低,新增结点是插入在低的那一边,插入后parent所在的子树高度不变,不会影响parent的父亲结点的平衡因子,更新结束
  • 若更新后的平衡因子等于1或-1,那么更新中parent的平衡因子变换情况也只有两种:0--->-1或者0--->-1,说明更新前parent子树两边一样高,新增结点插入后,导致parent所在的子树一边高一边低,不过parent所在的子树任然符合平衡要求,但是高度增加了1,会影响parent的父亲结点的平衡因子,所以要向上更新
  • 更新后的平衡因子等于2或-2,更新前更新中parent的平衡因子变换情况也是两种:1--->2或-1--->-2,说明更新前parent所在的子树一边高一边低,新增结点是插入在高的那一边,parent所在的子树高的那边更高了,破坏了平衡,很明显,parent所在的子树不符合平衡要求,这个时候就需要旋转处理了,旋转的目的有两个:1、把parent所在的子树旋转平衡2、降低parent所在子树高度,降低或恢复到插入结点前的高度。旋转以后就不用继续往上更新(因为高度不变)
  • 不断更新,更新到根节点,根节点的平衡因子是1或-1就停止了

2.2.3插入结点及平衡因子更新的代码实现

	bool Insert(const pair<K, V> kv){if (root == nullptr){_root = new Node(kv);return true;}Node* cur = _root;Node* parent = cur;while (cur){// 小于往左边走if (kv.first < cur->_kv.first){parent = cur;cur = cur->_left;}// 大于往右边走else if (kv.first > cur->_kv.first){parent = cur;cur = cur->_right;}else{return false;}}cur = new Node(kv);// 大于在右边if (kv.first > parent->_kv.first){parent->_right = cur;}// 小于在左边else{parent->_left = cur;}// 链接父子关系cur->_parent = parent;// 处理平衡因子while (parent){// 插在在左边--if (parent->_left == cur){parent->_bf--;}// 插在在右边++else{parent->_bf++;}// 等于0就不用向上更新if (parent->_bf == 0){break;}else if (parent->_bf == 1 || parent->_bf == -1){cur = parent;parent = parent->_parent;}else if (parent->_bf == 2 || parent->_bf == -2){// 旋转处理}else{//当出现其他情况时,处理错误assert(false);}}return false;}

2.3旋转

2.3.1旋转的原则

  • 保持搜索树的规则
  • 将旋转的树从不平衡变平衡,降低旋转树的高度

旋转的方式有四种:左单旋、右单旋、左右双旋、右左双旋。

2.3.2右单旋

  • 图中展示的根节点为10的AVL树抽象图,a、b、c均为三颗高度为h的子树(h>=0),a、b、c均符合AVL树的要求,10可能是整棵树的根,也可能是一整棵树中局部的子树的根。通过抽象图的方式进行一种概括抽象的表示,其代表了所有右单旋的场景,但是实际上的右单旋的具体形态有很多种。
  • 在a子树中插入一个新结点,导致a子树的高度从h变为h+1,不断向上更新平衡因子,导致结点10的平衡因子从-1变为-2,10为根的树左右高度差超过1,违反了平衡规则,10为根的树的左边太高了,需要往右边旋转,以控制两棵树的平衡。
  • 旋转的核心步骤:因为 5 < b子树的值 < 10,这个时候将b变成10的左子树,10变成5的右子树,5变成这棵树新的根,既符合搜索树的规则,控制了平衡,同时又将这棵树的高度恢复到插入之前的h+2。如果结点10是整棵树的局部子树,那么通过这样的旋转方式也不会影响上一层,所以插入就到此结束了。

具体的a、b、c高度讨论:

  • 当h等于0的时候,这种时候很简单,只需要将5作为新的根,10放到其右边即可
  • 当h等于1的时候,同样的,一样的方式进行旋转
  • 当h等于2的时候,AVL子树的情况要加以注意(以a、b、c为x的形状进行分析)
  • 当h等于3的时候,可能出现的情况就更多,也更加复杂

通过这样的推导可以看出抽象图的重要性,在后面的右旋和双旋部分都主要以抽象图来讨论。

右单旋代码实现:

void RotateR(Node* parent)
{Node* subL = parent->_left;Node* subLR = subL->_right;Node* ppNode = parent->_parent;// 链接结点,注意不要漏了_parent也要正确连接parent->_left = subLR;if (subLR){subLR->_parent = parent;}subL->_right = parent;parent->_parent = subL;// parent的上面还有结点,parent只是整棵树中的一棵子树if (ppNode){if (ppNode->_left == parent){ppNode->_left = subL;}else{ppNode->_right = subL;}subL->_parent = ppNode;}// parent就是根结点,更新根结点else{_root = subL;_root->_parent = nullptr;}// 处理平衡因子,需要更改的只有parent和subL(因为只有他们两个的子树发生了改变)parent->_bf = 0;subL->_bf = 0;
}

2.3.3左单旋

  • 左单旋和右单旋非常相似。图中展示的根节点为10的AVL树抽象图,a、b、c均为三颗高度为h的子树(h>=0),a、b、c均符合AVL树的要求,10可能是整棵树的根,也可能是一整棵树中局部的子树的根。通过抽象图的方式进行一种概括抽象的表示,其代表了所有左单旋的场景,但是实际上的左单旋的具体形态有很多种(同右单旋)。
  • 在a子树中插入一个新结点,导致a子树的高度从h变为h+1,不断向上更新平衡因子,导致结点10的平衡因子从1变为2,结点10为根的树左右高度差超过1,违反了平衡规则。结点10为根的树右边太高了,需要左往左边旋转,以控制两棵树的平衡
  • 旋转核心步骤:因为5 < b子树 <10,将b变成10的左子树,10变为5的右子树,5变为这棵树新的根,既符合搜索树的规则,控制了平衡,同时又将这棵树的高度恢复到插入之前的h+2。如果结点10是整棵树的局部子树,那么通过这样的旋转方式也不会影响上一层,所以插入就到此结束了。

左单旋的代码实现:

	void RotateL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;Node* ppNode = parent->_parent;parent->_right = subRL;if (subRL){subRL->_parent = parent;}subR->_left = parent;parent->_parent = subR;if (ppNode){if (ppNode->_left == parent){ppNode->_left = subR;}else{ppNode->_right = subR;}subR->_parent = ppNode;}else{_root = subR;subR->_parent = nullptr;}parent->_bf = 0;subR->_bf = 0;}

2.3.4左右双旋

简单的观察不难发现,左单旋和右单旋都几乎是一条直线上的插入,这就导致有些场景不适用,需要其他的方法结合才能实现平衡

如图中显示,当左边高的时候,如果插入的位置不是a子树,而是插入在b子树,b子树的高度从h变为h+1,引发旋转,但是这个时候用右单旋无法解决问题,右单旋后,树依旧不平衡。因为右单旋是纯粹的解决左边高,但是插入在b子树中,结点10为根的子树不再是简单的左边高,对于10来说是左边高,但是对于结点5来说,是右边高,这时就需要两次旋转才能解决问题,以5为旋转点进行一个左单旋,再以10为旋转点进行一个右单旋,这棵树就平衡了。

下面同样的还是通过抽象图的方式具体分析

图中将b子树进一步分为8(不一定是8,只是8符合这里的AVL树,可以是大于5小于10的值)和左子树高度为h-1的e和f子树,因为要对b的父亲结点5为旋转点进行左单旋,左单旋需要动b子树中的左子树。b子树中新增结点的位置不同,平衡因子更新的细节也不同,分为下面三种情况讨论:

  • 情况1:h>=1时,新增结点插入在e子树,e子树高度从h-1变为h,并不断更新8---->5--->10平衡因子,引发旋转,旋转后8的平衡因子从-1变为了0,结点10的平衡因子从-2变为1,结点5的平衡因子从1变为0
  • 情况2:h>=1时,新增结点插入在f子树,f子树高度从h-1变为h,并不断更新8---->5--->10平衡因子,引发旋转,旋转后8的平衡因子从1变为0,结点10的平衡因子从-2变为0,结点5的平衡因子从1变为-1
  • 情况3:h==0时,a、b、c都是空树,b自己就是一个新增结点,不断更新5--->10平衡因子,引发旋转,旋转后8的平衡因子还是0,结点5的平衡因子从1变为0,10的平衡因子从-2变为0

左右双旋代码实现

void RotateLR(Node* parent)
{Node* subL = parent->_left;Node* subLR = subL->_right;int bf = subLR->_bf;// 提前存储平衡因子,左单旋和右单旋之后就变了//RotateL(subL);RotateL(parent->_left);RotateR(parent);if (bf == 0){subL->_bf = 0;subLR->_bf = 0;parent->_bf = 0;}// 新增在subLR左边else if (bf == -1){subL->_bf = 0;subLR->_bf = 0;parent->_bf = 1;}// 新增在subLR右边else if (bf == 1){subL->_bf = -1;subLR->_bf = 0;parent->_bf = 0;}else{assert(false);}
}

2.3.5右左双旋

类似于左右双旋,将a、b、c子树抽象为高度为h的AVL子树

将b子树进一步分为12(不一定是12,只是12符合这里的AVL树,可以是大于10小于15的值)和左子树高度为h-1的e和f子树,因为要对b的父亲结点5为旋转点进行右单旋,右单旋需要动b子树中的左子树。b子树中新增结点的位置不同,平衡因子更新的细节也不同,分为下面三种情况讨论:

  • 情况1:h>=1时,新增结点插入在e子树,e子树高度从h-1变为h,并不断更新12---->15--->10平衡因子,引发旋转,旋转后12的平衡因子从-1变为了0,结点15的平衡因子从-1变为1,结点10的平衡因子从2变为0
  • 情况2:h>=1时,新增结点插入在f子树,f子树高度从h-1变为h,并不断更新12---->15--->10平衡因子,引发旋转,旋转后12的平衡因子从1变为0,结点15的平衡因子从-1变为0,结点10的平衡因子从2变为-1
  • 情况3:h==0时,a、b、c都是空树,b自己就是一个新增结点,不断更新15--->10平衡因子,引发旋转,旋转后12的平衡因子还是0,结点15的平衡因子从-1变为0,10的平衡因子从2变为0

右左双旋代码实现

	void RotateRL(Node* parent){Node* subR = parent->_right;Node* subRL = subR->_left;int bf = subRL->_bf;//RotateR(subR);RotateR(parent->_right);RotateL(parent);if (bf == 0){subR->_bf = 0;subRL->_bf = 0;parent->_bf = 0;}else if (bf == -1){subR->_bf = 1;subRL->_bf = 0;parent->_bf = 0;}else if (bf == 1){subR->_bf = 0;subRL->_bf = 0;parent->_bf = -1;}else{assert(false);}}

2.4AVL树的查找

AVL树的查找和二叉搜索树一样,按照规进行查找即可,效率是O(logN)

	Node* Find(K k){Node* cur = _root;while (cur){if (cur->_kv.first == k){return cur;}else if (k < cur->_kv.first){cur = cur->_left;}else if (k > cur->_kv.first){cur = cur->_right;}else{assert(false);}}return nullptr;}

2.5AVL树的平衡检测

在写完AVL树的时候,如果要检测是否平衡,不能通过直接遍历结点的平衡因子来判断是否平衡,要通过计算每颗子树的高度差来判断;因为要是本来这棵树内部平衡因子的计算方式就是有问题的,就会判断错误了。

	int Height(){return _Height(_root);}void IsBalnceAVLTree(){if (_IsBalnceAVLTree(_root)){cout << "此树是平衡的AVL树" << endl;}}
private:bool _IsBalnceAVLTree(Node* root){if (root == nullptr){return true;}int LeftTreeHeight = _Height(root->_left);int RightTreeHeight = _Height(root->_right);int SubBc = RightTreeHeight - LeftTreeHeight;if (abs(SubBc) >= 2){cout << "高度差异常" << endl;}else if (root->_bf != SubBc){cout << "平衡因子异常" << endl;}return _IsBalnceAVLTree(root->_left) && _IsBalnceAVLTree(root->_right);}int _Height(Node* root){if (root == nullptr){return 0;}int leftheight = _Height(root->_left);int rightheight = _Height(root->_right);return max(leftheight, rightheight) + 1;}

AVL树的删除后面有再时间补充...

相关文章:

AVL 树

1.AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AVL树可以是一棵空树&#xff0c;或者具有以下性质的树&#xff1a;左右子树都是AVL树。且左右子树的高度差的绝对值不超过1。 AVL树是一颗高度平衡搜索二叉树&#xff0c;通过控制高度去控制平衡。 AVL树的发明…...

PHP关键字Self、Static和parent的区别

简介 在使用PHP代码时&#xff0c;您可能经常会遇到parent::、static::和self::。但是当你第一次作为一个开发人员开始的时候&#xff0c;有时候你会很困惑&#xff0c;不知道它们是做什么的&#xff0c;以及它们之间的区别。 在我第一次作为开发人员开始工作后的很长一段时间…...

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}...

golang标准库archive/tar实现打包压缩及解压

文章目录 前言一、单个文件操作1.单个文件打包示例2.单个文件解包示例 二、目录示例1.打包压缩2.解包 补充 前言 这个包就是将文件进行打包和解包&#xff0c;通俗理解就是Linux 下的 tar 命令。 主要是通过 tar.Reader 读取 tar 包&#xff0c;通过 tar.Writer 写入 tar包&am…...

模方匀色功能中,加载的模板文件从哪里来

使用 DasViewerV3.1.2及以上版本导出的颜色调整文件 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.2新增内置“自动UV展开”功能&#xff0c;新增局部调色功能和DOM匀色功能等。同时可与…...

maya 删除 Ctrl + Delete vs Delete

在 Autodesk Maya 中删除选定顶点的步骤&#xff1a; 1. 选择顶点&#xff1a; 进入顶点选择模式&#xff1a; 按 F9 键&#xff08;切换到顶点选择模式&#xff09;。 或者&#xff0c;在工具栏中点击顶点选择图标&#xff08;顶点模式&#xff09;。 在视图中选择您想要删…...

为何String不可变,String的运算符重载

1.为何String不可变 java9之前&#xff0c;String的源码中是用字符数组实现的&#xff0c;同时使用了final和private修饰&#xff0c;被final修饰的结果就是变量不可修改、类不可继承、方法不可重写&#xff0c;被private修饰就无法对外暴露&#xff0c;这就是为何String不可变…...

WebRTC :原理、协议和应用场景

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种用于在Web浏览器和移动应用程序之间进行实时通信的开放标准。它通过将音频、视频和数据传输集成到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。 一、WebRTC 的原理 WebRTC的实…...

Windows FTP服务器搭建指南

在Windows上搭建FTP服务器可以通过以下步骤完成。这里以Windows 10为例&#xff0c;使用系统自带的IIS&#xff08;Internet Information Services&#xff09;来搭建FTP服务器。 步骤1&#xff1a;安装IIS和FTP服务器组件 打开“控制面板”&#xff1a; 按 Win R&#xff0c…...

DP协议:Link层(二)

书接上文,内容多了难免会有一种知识点零碎感,但是坚持学下去,有一天你会发现已经不知不觉可以链接成一张知识网络了。 AUX提供的services 前面咱刚刚简单的认识了AUX CH的状态和仲裁,这次咱们接着聊聊AUX提供的services。 管理连接和设备:AUX CH就像是一个管家,负责找到…...

HAL 库 HAL_UARTEx_ReceiveToIdle_IT 函数解析

一、存在位置&#xff1a;stm32f1xx_hal_uart.c 二、具体代码 二、返回值&#xff1a;HAL_StatusTypeDef 通过查看返回值HAL_StatusTypeDef在stm32f1xx_hal_edf.h文件中定义为结构体类型。 status&#xff1a;&#xff08;进展的&#xff09;状况&#xff0c;情形 三、函数名…...

C++ 设计模式:职责链模式(Chain of Responsibility)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 组合模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这些对象通过…...

数据库约束和查询

一 约束意义 这个后面的字段是什么意思呢? 先前说数据类型是一种约束&#xff0c;约束我们只能放该类型的数据&#xff0c;还有其它的约束来保证数据的合法性&#xff0c;下面的字段就和约束有关。 编译器的编译就是一个约束&#xff0c;保证我们的代码一定是语法合格的。我们…...

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(二)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.1.2 基于注意力的解释&#xff08;Attention-Based Explanation&#xff09; 注意力机制可以揭示输入数据中各个部分之间的关系&#…...

AI大模型-提示工程学笔记1

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 几个基本概念 1. 给LLM提示 用户可以通过简单的提示词&#xff08;Prompts&#xff09…...

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…...

百度PaddleSpeech识别大音频文件报错

一、背景 公司前同事留下了一套语音识别项目&#xff0c;内部使用百度PaddleSpeech。在项目验收的时候发现无法识别大音频文件&#xff0c;但是可以识别小音频文件。 这套项目是通过python调用的百度PaddleSpeech&#xff0c;然后提供了restful接口&#xff0c;然后java项目可…...

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度&#xff0c;使⽤不同的数据类型&#xff0c;能够创建出⻓度不同的变量&#xff0c;变量⻓度的不同&#xff0c;存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字&#xff0c;也是操作符&#xff0c;专⻔是⽤来计算特…...

MapReduce相关概念(自用)

MapReduce&#xff1a;分布式计算模型 MapReduce 是一种分布式计算模型&#xff0c;由 Google 在 2004 年提出&#xff0c;用于大规模数据集&#xff08;TB 或 PB 级别&#xff09;的分布式处理。它通过简单的编程模型&#xff0c;将复杂的分布式计算分解为两个基本阶段&#…...

Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)

文章目录 概述步骤 1: 安装 Nginx 和 Lua 模块步骤 2: 创建 Lua 脚本用于参数校验步骤 3: 配置 Nginx 使用 Lua 脚本写法二&#xff1a; 状态码写法三 &#xff1a; 返回自定义JSON复杂的正则校验 步骤 4: 测试和验证ngx.HTTP_* 枚举值 概述 一个不使用 OpenResty 的 Nginx 集…...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

AI助手网站

​​​​​​​ chatgpt &#xff1a;https://chatgpt.com/ https://openai.com/index/chatgpt/ 百度ai助手 https://chat.baidu.com/ 百度AI助手https://chat.baidu.com/ 文心快码 文心快码BaiduComate 文心快码BaiduComate 文心快码BaiduComate有代码问题&#xff0c;问文…...

初始nginx

华子目录 nginx介绍nginx功能介绍基础特性web服务相关功能nginx进程结构web请求处理机制 nginx进程间通信nginx启动与http连接建立http处理过程 nginx模块介绍nginx命令演示 nginx介绍 nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服…...

可扩展性设计架构模式——事件驱动架构

事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;是一种可扩展性设计软件架构模式&#xff0c;它通过事件来触发和通信&#xff08;以事件为核心&#xff09;&#xff0c;实现不同系统组件之间的解耦&#xff08;促进应用程序或系统部件之间的松耦合通信&a…...

Prometheus 专栏 —— Prometheus安装、配置

配置文件基本结构 global: 全局配置 scrape_interval: 抓取目标指标的频率&#xff0c;默认为 1minevaluation_interval: 评估告警规则的频率&#xff0c;默认为 1minscrape_timeout: 抓取目标指标数据拉取超时&#xff0c;默认为 10s&#xff0c;如果出现 context deadline e…...

Java并发编程面试题:线程池Fork/Join(19题)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【每日学点鸿蒙知识】WebView代理、2D绘制矩形圆角、TextInput清理按钮、pdf滑动、icon配置问题

1、HarmonyOS Webview 支持设置代理功能吗&#xff1f; 使用Web的onInterceptRequest先拦截再代理来实现。具体可以参考文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-web-V5#ZH-CN_TOPIC_0000001930757269__on…...

抽奖系统(1)(Java 实现)

1. 需求描述 1. 包含管理员的注册与登录 1) 注册包含&#xff1a;姓名、邮箱、手机号、密码 2) 登录包含两种方式 (1) 电话 密码登录 (2) 电话 短信登录&#xff1b;验证码获取 (3) 登录需要校验管理员身份 2. 人员管理&#xff1a;管理员支持创建普通用户&#xff0c;查看…...

数据库系统原理复习汇总

数据库系统原理复习汇总 一、数据库系统原理重点内容提纲 题型&#xff1a;主观题 1、简答题 第一章&#xff1a;数据库的基本概念&#xff1a;数据库、数据库管理系统、三级模式&#xff1b;两级映像、外码 第二章&#xff1a;什么是自然连接、等值连接&#xff1b; 第三…...

基于16QAM的载波同步和定时同步性能仿真,采用四倍采样,包括Costas环和gardner环

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 载波同步是…...

鸿蒙next RCP网络请求工具类进阶版来了

前言&#xff1a; 各位同学大家好&#xff0c;有一段时间没有更新文章了,最近因为鸿蒙官方的网络请求换掉了了rcp 之前是使用http 这些都是原生开发的 当然有那种三方大家熟知的 axios (这个也是基于http 后面也会过时)所以大家还是要了解一下rcp的原生的网络请求的。那么我们…...

driftingblues6_vh靶机

首先把靶机换成NAT模式 使用 arp-scan 命令扫描网段内存活的主机&#xff0c;以获取靶机ip地址 arp-scn -l 尝试访问ip 使用御剑扫描子域名&#xff0c;尝试访问robots.txt文件 通过访问文件我们发现了一个/textpattern/textpattern目录 访问一下目录发现了登录页面 他还给了…...

Go语言入门

文章目录 零、Linux下Go的安装1.下载、解压2.添加环境变量3.验证安装4.初始化Go模块(1)cd到项目目录(2)初始化模块(3)获取依赖包(4)清理和验证依赖(5)检查 go.mod 文件(6)介绍 go.mod 和 go.sum 文件 5.项目目录结构 一、感性认识1.从 Hello world 开始2.加法函数 二、Go语法1.…...

VS Code中怎样查看某分支的提交历史记录

VsCode中无法直接查看某分支的提交记录&#xff0c;需借助插件才行&#xff0c;常见的插件如果git history只能查看某页面的改动记录&#xff0c;无法查看某分支的整体提交记录&#xff0c;我们可以安装GIT Graph插件来解决这个问题 1.在 VSCode的插件库中搜索 GIT Graph安装&a…...

【杂谈】-AI搜索引擎如何改变传统SEO及其在内容营销中的作用

AI搜索引擎如何改变传统SEO及其在内容营销中的作用 文章目录 AI搜索引擎如何改变传统SEO及其在内容营销中的作用1、什么是AI搜索引擎2、AI搜索引擎对SEO策略的影响3、AI搜索引擎在内容营销转型中的作用4、AI搜索引擎在营销领域的挑战、道德问题和未来5、总结 在当今的数字营销世…...

快速掌握Haproxy原理架构

文章目录 一、原理架构二、无负载均衡三、四层负载均衡的工作流程四、七层负载均衡工作流程五、基础属性mode 属性retries 属性maxconn 属性clitimeout 属性servtimeout 属性states uri 属性 一、原理架构 四层tcp代理&#xff1a;Haproxy仅在客户端和服务器之间双向转发流量&…...

Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】

第一种思路是先将它们都转换为小写或大写&#xff0c;再使用String类的startsWith()方法实现: 例如&#xff0c;如下的二个示例&#xff1a; "Session".toLowerCase().startsWith("sEsSi".toLowerCase()); //例子之一//例子之二String str "Hello Wo…...

如何提高Redis服务器的最大打开文件数限制

文章目录 如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制3. 修改Redis配置文件4. 修改systemd服务文件5. 重新加载systemd并重启Redis6. 验证更改 注意事项 如何提高Redis服务器的最大打开文件数限制 在运行高并发…...

React 组件通信完整指南 以及 自定义事件发布订阅系统

React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…...

代码随想录算法【Day5\Day6】

DAY5\Day6 1.熟悉哈希表的数据结构&#xff1a;数组、map和set&#xff0c;使用方法、使用场景 2.哈希表应用场景&#xff1a;解决给你一个元素&#xff0c;判断它在集合里是否出现过。 242.有效的字母异位词 本题用数组解决的。 class Solution { public:bool isAnagram(…...

Oracle 数据库执行计划的查看与分析技巧

目录 Oracle 数据库执行计划的查看与分析技巧一、什么是执行计划二、查看执行计划的方法&#xff08;一&#xff09;使用 EXPLAIN PLAN 命令&#xff08;二&#xff09;通过 SQL Developer 工具查看&#xff08;三&#xff09;启用 AUTOTRACE 功能 三、执行计划中的关键信息解读…...

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比

VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比 目录 VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比; 2.单变量时间序列预测 就是先vmd把变…...

QGIS二次开发(地图符号库操作)

实习三 地图符号库操作 3.1 任务要求 基于QGIS&#xff0c;实现地图符号的设计/存储与显示&#xff1b;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号&#xff0c;改变矢量图层的显示效果&#xff1b;可编辑地图的符号库汇中的点符号、线符号、面符号…...

wordpress网站用token登入开发过程

生成跳转token 示例&#xff1a; function generate_login_token($user_id, $secret_key) {$payload [user_id > $user_id,timestamp > time(),];$payload_json json_encode($payload);$signature hash_hmac(sha256, $payload_json, $secret_key);return base64_en…...

Uniapp在浏览器拉起导航

Uniapp在浏览器拉起导航 最近涉及到要在浏览器中拉起导航&#xff0c;对目标点进行路线规划等功能&#xff0c;踩了一些坑&#xff0c;找到了使用方法。&#xff08;浏览器拉起&#xff09; 效果展示 可以拉起三大平台及苹果导航 点击选中某个导航&#xff0c;会携带经纬度跳转…...

在 CentOS 上安装 FFmpeg

在CentOS 上安装 FFmpeg 方法一&#xff1a;在线安装 添加 EPEL 和 RPM Fusion 源&#xff1a; sudo yum install epel-release sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm安装 FFmpeg&#xff1a; sudo yu…...

影刀进阶指令 | liblib反推 (SD AI绘图反推)

文章目录 影刀进阶指令 | liblib反推 (SD AI绘图反推)一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 获取png地址2\. 打开页面3\. 上传png文件4\. 获取png的prompt信息 四. 运维 影刀进阶指令 | liblib反推 (SD AI绘图反推) 先看看我们要实现的功能&#xff0c;li…...

WebStorm 创建一个Vue项目

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWupC…...

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归…...

rust windwos 两个edit框

use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量&#xff0c;用于保存 Edit 控件的…...