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

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念

什么是AVL树?

AVL树是一种自平衡的二叉搜索树,其发明者是Adelson-Velsky和Landis,因此得名“AVL”。AVL树是首个自平衡二叉搜索树,通过对树的平衡因子进行控制,确保任何节点的左右子树高度差最多为1,从而保证树的高度为对数级别,即 O(log⁡N)O(\log N)O(logN)。

在AVL树中,插入、删除和查找的时间复杂度都可以保持在 O(log⁡N)O(\log N)O(logN),这使得AVL树在需要频繁查询数据的应用场景中非常高效。

AVL树的平衡因子

每个节点有一个平衡因子(Balance Factor),定义如下:

  • 平衡因子 = 右子树高度 - 左子树高度
  • 对于任何节点,平衡因子的可能取值为 -1、0、1。

AVL树通过保持所有节点的平衡因子在上述范围内,确保了树的平衡。这个平衡性减少了树的高度,从而提高了数据查找效率。

为什么要平衡?

普通的二叉搜索树(BST)在最坏情况下会退化成链表。例如,按照递增顺序插入节点会使树的所有节点都集中在右边,导致高度等于节点数,查找复杂度为 O(N)O(N)O(N)。AVL树通过自动维护平衡性,避免了这种情况,确保所有操作的复杂度始终为对数级别。


2. AVL树的实现

2.1 AVL树的结构

AVL树的节点结构非常类似于普通的二叉树节点,不过增加了一个字段用于存储平衡因子。以下是AVL树节点的结构定义:

template<class K, class V>
struct AVLTreeNode {pair<K, V> _kv;  // 键值对AVLTreeNode<K, V>* _left;  // 左子节点AVLTreeNode<K, V>* _right; // 右子节点AVLTreeNode<K, V>* _parent; // 父节点int _bf;  // 平衡因子(balance factor)AVLTreeNode(const pair<K, V>& kv): _kv(kv), _left(nullptr), _right(nullptr), _parent(nullptr), _bf(0) {}
};

2.2 AVL树的插入

AVL树的插入操作和普通二叉搜索树的插入类似,但需要额外的步骤来确保树的平衡。如果插入新节点后某些节点失衡,我们需要通过旋转来恢复平衡。

插入步骤概述
  1. 按普通BST的规则插入:首先将节点按照二叉搜索树的规则插入。
  2. 更新平衡因子:从插入节点开始,向上遍历其祖先节点,更新每个节点的平衡因子。
  3. 检查并旋转平衡树:如果某节点的平衡因子变为2或-2,说明该节点失衡。此时需要通过旋转操作恢复平衡。
插入代码实现

以下是AVL树插入节点的代码实现:

bool Insert(const pair<K, V>& kv) {if (_root == nullptr) {_root = new Node(kv);return true;}Node* parent = nullptr;Node* cur = _root;while (cur) {if (cur->_kv.first < kv.first) {parent = cur;cur = cur->_right;} else if (cur->_kv.first > kv.first) {parent = cur;cur = cur->_left;} else {return false;  // 不允许插入重复的键值}}cur = new Node(kv);if (parent->_kv.first < kv.first) {parent->_right = cur;} else {parent->_left = cur;}cur->_parent = parent;// 更新平衡因子while (parent) {if (cur == parent->_left) {parent->_bf--;} else {parent->_bf++;}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) {// 失衡,需要进行旋转操作Balance(parent);break;} else {assert(false); // 不应存在其他情况}}return true;
}

2.3 旋转操作

当AVL树失去平衡时,通过旋转操作来恢复平衡。旋转的类型分为四种:右单旋左单旋左右双旋右左双旋。每种旋转操作都有其适用场景和具体的实现。

旋转的类型
  1. 右单旋(Right Rotation):用于修正左子树过高的情况。
  2. 左单旋(Left Rotation):用于修正右子树过高的情况。
  3. 左右双旋(Left-Right Rotation):用于修正节点插入在左子树的右侧,导致子树高度增加的情况。
  4. 右左双旋(Right-Left Rotation):用于修正节点插入在右子树的左侧,导致子树高度增加的情况。
右单旋实现

右单旋用于修正某个节点的左子树过高的情况。以下是右单旋的代码:

void RotateR(Node* parent) {Node* subL = parent->_left;Node* subLR = subL->_right;parent->_left = subLR;if (subLR) {subLR->_parent = parent;}Node* parentParent = parent->_parent;subL->_right = parent;parent->_parent = subL;if (parentParent == nullptr) {_root = subL;subL->_parent = nullptr;} else {if (parent == parentParent->_left) {parentParent->_left = subL;} else {parentParent->_right = subL;}subL->_parent = parentParent;}// 更新平衡因子parent->_bf = subL->_bf = 0;
}
左单旋实现

左单旋用于修正某个节点的右子树过高的情况。以下是左单旋的代码实现:

void RotateL(Node* parent) {Node* subR = parent->_right;Node* subRL = subR->_left;parent->_right = subRL;if (subRL) {subRL->_parent = parent;}Node* parentParent = parent->_parent;subR->_left = parent;parent->_parent = subR;if (parentParent == nullptr) {_root = subR;subR->_parent = nullptr;} else {if (parent == parentParent->_left) {parentParent->_left = subR;} else {parentParent->_right = subR;}subR->_parent = parentParent;}// 更新平衡因子parent->_bf = subR->_bf = 0;
}
左右双旋和右左双旋实现

当子树的高度增加发生在左右子树中的某一侧时,单次旋转无法恢复平衡,需要进行双次旋转。

  • 左右双旋(Left-Right Rotation):首先对左子树进行左旋,再对祖先节点进行右旋。
  • 右左双旋(Right-Left Rotation):首先对右子树进行右旋,再对祖先节点进行左旋。
void RotateLR(Node* parent) {RotateL(parent->_left);RotateR(parent);
}void RotateRL(Node* parent) {RotateR(parent->_right);RotateL(parent);
}

2.4 AVL树的查找操作

AVL树的查找操作和普通二叉搜索树类似,由于AVL树保持平衡,查找操作的时间复杂度始终为 O(log⁡N)O(\log N)O(logN)。以下是查找的代码实现:

Node* Find(const K& key) {Node* cur = _root;while (cur) {if (cur->_kv.first < key) {cur = cur->_right;} else if (cur->_kv.first > key) {cur = cur->_left;} else {return cur; // 找到节点}}return nullptr; // 节点未找到
}

2.5 AVL树的平衡性检测(深入扩展)

平衡性检测的目标

AVL树的平衡性检测旨在验证每个节点是否满足AVL树的平衡要求,即每个节点的左右子树高度差绝对值不超过1,同时保证每个节点的平衡因子正确反映左右子树的高度差。

为了验证AVL树的平衡性,检测的目标有两个:

  1. 验证左右子树的高度差是否满足AVL条件
  2. 验证每个节点的平衡因子是否正确反映了其子树的高度差

平衡性检测的挑战

在进行平衡性检测时,我们面临两个主要挑战:

  1. 递归遍历的深度与效率问题:对树的每个节点,我们需要递归计算其子树的高度,较高的递归深度可能导致性能下降。
  2. 同步验证平衡因子:在递归计算高度的过程中,我们需要同时验证每个节点的平衡因子是否正确。

平衡性检测的代码实现

以下是用于检测AVL树平衡性和正确性的代码:

int _Height(Node* root) {if (root == nullptr) return 0;int leftHeight = _Height(root->_left);int rightHeight = _Height(root->_right);return max(leftHeight, rightHeight) + 1;
}bool _IsBalanceTree(Node* root) {if (root == nullptr) return true;// 计算左右子树的高度int leftHeight = _Height(root->_left);int rightHeight = _Height(root->_right);int diff = rightHeight - leftHeight;// 检查高度差是否符合AVL条件if (abs(diff) > 1) {cout << root->_kv.first << " 高度差异常: 左高=" << leftHeight << ", 右高=" << rightHeight << endl;return false;}// 检查平衡因子是否正确if (root->_bf != diff) {cout << root->_kv.first << " 平衡因子异常: 期望=" << diff << ", 实际=" << root->_bf << endl;return false;}// 递归检测左右子树是否平衡return _IsBalanceTree(root->_left) && _IsBalanceTree(root->_right);
}
代码说明
  1. 高度计算_Height 函数用于计算节点的高度,递归遍历每个节点的左右子树,返回最大的高度加1。
  2. 平衡性验证_IsBalanceTree 函数用于检测树的平衡性。它首先计算每个节点的左右子树高度差,然后检查其平衡因子是否符合AVL树的定义。
  3. 详细输出:为了帮助调试,函数在检测到异常时输出详细的信息,包括节点的键值、高度差和不匹配的平衡因子值。

平衡性检测的改进:优化高度计算

在上述实现中,_Height 函数被重复调用多次,可能会导致效率低下。特别是在平衡性检测过程中,每次都要重新递归计算子树的高度。我们可以通过以下优化来提升效率。

同时计算高度与检测平衡性

我们可以通过一次递归同时计算高度和检测平衡性,避免重复的高度计算。以下是改进后的代码:

// 新的平衡检测函数,返回子树的高度并同时检测是否平衡
int _CheckBalance(Node* root, bool& isBalanced) {if (root == nullptr) return 0;int leftHeight = _CheckBalance(root->_left, isBalanced);int rightHeight = _CheckBalance(root->_right, isBalanced);// 如果在递归过程中已经发现不平衡,直接返回if (!isBalanced) return 0;// 计算当前节点的高度差int diff = rightHeight - leftHeight;// 检查高度差是否符合AVL条件if (abs(diff) > 1) {cout << "节点 " << root->_kv.first << " 高度差异常: 左高=" << leftHeight << ", 右高=" << rightHeight << endl;isBalanced = false;}// 检查平衡因子是否正确if (root->_bf != diff) {cout << "节点 " << root->_kv.first << " 平衡因子异常: 期望=" << diff << ", 实际=" << root->_bf << endl;isBalanced = false;}// 返回子树的高度return max(leftHeight, rightHeight) + 1;
}// 检测整棵树是否平衡的入口函数
bool IsBalanceTree() {bool isBalanced = true;_CheckBalance(_root, isBalanced);return isBalanced;
}
代码改进点
  1. 高度计算与平衡检测结合

    • 在新的实现中,_CheckBalance 函数同时执行高度计算和平衡性检测。
    • 递归调用返回子树的高度,同时检查每个节点的平衡性,从而减少了重复的递归操作。
  2. 标志位

    • 通过 bool& isBalanced 参数作为标志位,当发现树中有不平衡的节点时,将其设为 false,并立即终止后续的递归。
    • 这样可以避免不必要的计算,提高检测的整体效率。
  3. 减少重复计算

    • 与之前的版本相比,新的实现避免了重复的高度计算,每个节点只需一次遍历即可完成高度计算和平衡性检测。

进阶:检查树的平衡因子及其更新的正确性

除了检测平衡性之外,还可以扩展检测模块,进一步确保AVL树中的每个节点的平衡因子在插入和旋转操作之后都得到了正确更新。以下是检测平衡因子的代码。

验证每个节点的平衡因子

在进行插入、删除等操作后,平衡因子必须保持正确更新。我们可以通过递归遍历整棵树来验证每个节点的平衡因子是否准确反映其子树的高度差。

bool ValidateBalanceFactors(Node* root) {if (root == nullptr) return true;// 递归获取左右子树高度int leftHeight = _Height(root->_left);int rightHeight = _Height(root->_right);int expectedBF = rightHeight - leftHeight;// 检查平衡因子是否正确if (root->_bf != expectedBF) {cout << "节点 " << root->_kv.first << " 的平衡因子不正确。应为 " << expectedBF << ",实际为 " << root->_bf << endl;return false;}// 递归验证左右子树的平衡因子return ValidateBalanceFactors(root->_left) && ValidateBalanceFactors(root->_right);
}
代码说明
  • ValidateBalanceFactors 函数遍历整个树,检查每个节点的平衡因子是否与其左右子树的高度差匹配。
  • 这种检测可以在每次插入、删除或旋转之后调用,以确保树在操作后没有出现错误的平衡因子。
  • 如果发现平衡因子不正确,程序会输出详细的错误信息,包括节点的键值、应有的平衡因子和当前存储的平衡因子。

平衡性检测的应用场景

  • 单元测试:在开发AVL树时,可以在每次插入、删除或旋转操作后调用平衡性检测函数,作为单元测试的一部分。
  • 调试与验证:通过详细的错误信息输出,开发者可以快速定位到问题节点,从而帮助调试和验证代码的正确性。
  • 性能优化:平衡性检测不仅可以帮助验证算法的正确性,还可以用于评估在不同数据分布和操作顺序下,AVL树的性能表现是否达到了预期。

3. AVL树的应用场景及优势

AVL树适合应用于需要高效查找的场景中,例如数据库中的索引结构、缓存系统中的快速查找等。相比于普通的二叉搜索树,AVL树保证了每次操作的时间复杂度为 O(log⁡N)O(\log N)O(logN),特别适合频繁插入和删除的应用。


4. C++实现的完整代码示例

以下是一个AVL树完整的C++实现代码示例,结合了插入、旋转、查找和检测的实现。

template<class K, class V>
class AVLTree {typedef AVLTreeNode<K, V> Node;public:bool Insert(const pair<K, V>& kv);Node* Find(const K& key);void InOrder() const;bool IsBalanceTree();private:Node* _root = nullptr;void RotateR(Node* parent);void RotateL(Node* parent);void RotateLR(Node* parent);void RotateRL(Node* parent);
};

在实际编程中,使用AVL树可以保证数据的有序性,同时保证在最坏情况下依然具有高效的时间复杂度,非常适合需要高频率动态数据维护的场景。


5. 结论

AVL树是一种经典的自平衡二叉搜索树,通过引入平衡因子和旋转操作,保持了树的平衡性,确保了插入、删除和查找操作的高效性。通过学习AVL树,我们可以深入理解数据结构的自平衡机制,以及如何在二叉树中保持最优的性能。

希望通过这篇博客,大家对AVL树的概念、实现和用途有更深的了解。如果你有任何疑问或者想了解更多相关内容,欢迎随时交流。

相关文章:

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树&#xff1f; AVL树是一种自平衡的二叉搜索树&#xff0c;其发明者是Adelson-Velsky和Landis&#xff0c;因此得名“AVL”。AVL树是首个自平衡二叉搜索树&#xff0c;通过对树的平衡因子进行控制&#xff0c;确保任何节点的左右子树高度差最多为1&…...

L15.【LeetCode笔记】相同的树

目录 1.题目 代码模板 2.分析 通过合理的if判断分类讨论两个根节点 1.首先,p和q都为NULL的情况最好排除 2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL 写法1 写法2 3.只剩下最后一种情况:p和q都不为NULL 3.代码 提交结果 1.题目 https…...

【算法】【优选算法】位运算(下)

目录 一、&#xff1a;⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算&#xff0c;异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、&#xff1a;⾯试题 01.01.判定字符是…...

网络——Socket与WebSocket

Socket与WebSocket都是网络通信中的重要概念&#xff0c;但它们在原理、应用场景及特性上存在显著的差异。以下是对两者的详细比较&#xff1a; 一、Socket 定义&#xff1a;Socket&#xff08;套接字&#xff09;是计算机网络中的一个抽象层&#xff0c;它允许应用程序通过网…...

Springboot3整合Redis

书接上篇《Redis 安装篇&#xff08;阿里云服务器&#xff09;_阿里云安装redis-CSDN博客》&#xff0c;安装好Redis后&#xff0c;就需要在springboot项目中使用Redis了。 一、SpringBoot整合Redis 1.添加坐标 <!--redis--> <dependency><groupId>org.sp…...

Java CountDownLatch 用法和源码解析

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

微信小程序3-显标记信息和弹框

感谢阅读&#xff0c;初学小白&#xff0c;有错指正。 一、实现功能&#xff1a; 在地图上添加标记点后&#xff0c;标记点是可以携带以下基础信息的&#xff0c;如标题、id、经纬度等。但是对于开发来说&#xff0c;这些信息还不足够&#xff0c;而且还要做到点击标记点时&a…...

Android 消息队列之MQTT的使用:物联网通讯,HTTP太重了,使用MQTT;断网重连、注册、订阅、发送数据和接受数据,实现双向通讯。

目录&#xff1a; 问题MQTT是什么以及为什么使用如何使用&#xff1a;第一阶段、基础功能如何使用&#xff1a;第二阶段、增加断网重连如何使用&#xff1a;第三阶段、封装 一、问题 在开发的时候&#xff0c;我们一般都使用Http和后台进行通讯&#xff0c;比如我们是开发物联…...

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后&#xff0c;在IDEA中创建的项目中建立一个lib目录&#xff0c;然后把刚刚下载好的jar包拷贝进去&#xff0c;然后右键刚刚添加的jar包&#xff0c;点击‘添…...

详解C++类与对象(四)

文章目录 1.类型转换1.1 前言1.2 类型转换的性质 2.static成员2.1 前言2.2 static的基本概念 3.友元4.内部类5.匿名对象 1.类型转换 1.1 前言 在C中&#xff0c;由于程序员可以自己显示定义一个新的类。这样就会出现一个问题&#xff1a;程序员自己显示定义的类类型与编译器中…...

使用 postman 传递 binary 类型的图片到后端接口遇到的坑

使用 psotman 传 binary 类型图片报错&#xff1a; -2024-12-04 [http-nio-9090-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required r…...

第9章 大模型的有害性(上)

9.1 引言 本章将探讨大型语言模型&#xff08;LLMs&#xff09;可能带来的有害性&#xff0c;重点讨论以下几个方面&#xff1a; 性能差异社会偏见和刻板印象 在后续内容中&#xff0c;还会涉及其他层面的危害&#xff0c;如有害信息、虚假信息、隐私和安全风险、版权问题、…...

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变&#xff08;Radial Distortion&a…...

Java爬虫技术全解析:从入门到精通

引言 在信息爆炸的今天&#xff0c;数据成为了最宝贵的资源之一。爬虫技术作为获取网络数据的重要手段&#xff0c;广泛应用于数据采集、信息聚合、市场分析等多个领域。Java作为一种强类型、面向对象的编程语言&#xff0c;以其稳健的性能和跨平台的特性&#xff0c;成为了开…...

leetcode hot100【Leetcode 416.分割等和子集】java实现

Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums &#xff0c;你需要将该数组分割成两个子集&#xff0c;使得两个子集的元素和相等。如果可以分割&#xff0c;返回 true &#xff0c;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,…...

位段详解+代码展示

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…...

python实现c++中so库调用及dbus服务开发

本期介绍主要分两块,一块是python如何调用so库,另一块是dbus服务的注册与调用; python调用so库 1. c++源码 # test.h文件#include<iostream> using namespace std;extern "C"{ int cacl(int a, int b); struct student{char sname[50];int score;}; stud…...

如何进行GC调优

目录 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 3、优化策略 这个属于较为开放题目&#xff0c;可以结合自己项目实战出发&#xff0c;体现JVM调优。 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 (1) 将进入老年代的对象数量降到最低 (2) 减少FullGC的执行…...

JAVA |日常开发中读写TXT文本详解

JAVA &#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用BufferedReader读取1.2 使用Scanner读取 二、写入 TXT 文本2.1 使用BufferedWriter写入2.2 使用PrintWriter写入2.3 字节流写入&#xff08;FileOutputStream&#xff09;后转换为字符流&#xff08;…...

开源模型应用落地-安全合规篇-用户输入价值观判断(三)

一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...

apache部署若依前后端分离项目(开启SSL)

网站部署之后,大多数需要配置https,所以本章教程,介绍使用apache部署若依前后端项目的时候,如何开启SSL,以及如何配置SSL证书。 一、安装ssl模块 默认情况下,ssl模块是没有安装的。需要手动安装,否则直接配置SSL模块的时候,会报错。 sudo yum install mod_ssl二、查询s…...

VMware Workstation Pro安装教程 (全图文保姆级)

一、前言 系统&#xff1a;Windows 11时间&#xff1a;2024/12/04需求&#xff1a;注册&#xff1a;broadcom&#xff08;邮箱&#xff09;难点&#xff1a;在官网找到下载链接 二、说明 建议前往官网&#xff08;https://www.vmware.com&#xff09;下载&#xff0c;可能加…...

【机器学习】—Transformers的扩展应用:从NLP到多领域突破

好久不见&#xff01;喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 &#xff08;一&#xff09;、核心组件 &#xff08;二&#xff09;、架构图 二、领域扩展&#xff1a;从NLP到更多场景 1. 自然语言处理&#xff08;NLP&#xff09; 2…...

Linux权限机制深度解读:系统安全的第一道防线

文章目录 前言‼️一、Linux权限的概念‼️二、Linux权限管理❕2.1 文件访问者的分类&#xff08;人&#xff09;❕2.2 文件类型和访问权限&#xff08;事物属性&#xff09;✔️1. 文件类型✔️2. 基本权限✔️3. 权限值的表示方法 ❕2.3 文件访问权限的相关设置方法✔️1. ch…...

【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)

引用此数据集&#xff1a; Sharma, Ankur (2020), “Onco-fetal reprogramming of endothelial cells drives immunosuppressive macrophages in Hepatocellular Carcinoma (Sharma et al)”, Mendeley Data, V1, doi: 10.17632/6wmzcskt6k.1 下载地址&#xff1a;Onco-feta…...

LangChain学习笔记(一)-LangChain简介

LangChain学习笔记&#xff08;一&#xff09;-LangChain简介 langChain是一个人工智能大语言模型的开发框架&#xff0c;主要构成为下图。 ​ ​ 一、核心模块 &#xff08;一&#xff09;模型I/O模块 负责与现有大模型进行交互&#xff0c;由三部分组成&#xff1a; 提…...

【Dubbo03】消息队列与微服务之dubbo-admin 二进制与编译安装

实战案例&#xff1a;二进制安装 dubbo-admin 新版用Golang重构&#xff0c;提供了二进制包&#xff0c;可以直接部署 #下载二进制包 [rootubuntu2204 ~]#wget https://github.com/apache/dubbo-admin/releases/download/0.5.0/apache-dubbo-admin-0.5.0-bin-release.tar.gz …...

常见问题QA的前端代码

这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面&#xff0c;页面分为左右两部分&#xff0c;左侧用于展示对话记录&#xff0c…...

【Java基础面试题010】Java中的基本数据类型有哪些?

相关知识补充&#xff1a;《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java提供了8中基本数据类型 整型&#xff1a; byte&#xff1a;占用1字节&#xff0c;取值范围 -128 到 127short&#x…...

记录部署dvwa靶场踩的几个坑

DVWA reCAPTCHA key: Missing 解决方法&#xff1a;网上随便copy一个&#xff0c;粘贴到config.inc.php配置文件里&#xff0c;具体我也是参考这篇文章的&#xff1a;DVWA下载、安装You dont have permission to access this resource.Server unable to read htaccess file, de…...

【Pytorch】torch.reshape与torch.Tensor.reshape区别

问题引入&#xff1a; 在Pytorch文档中&#xff0c;有torch.reshape与torch.Tensor.reshape两个reshape操作&#xff0c;他们的区别是什么呢&#xff1f; 我们先来看一下官方文档的定义&#xff1a; torch.reshape&#xff1a; torch.Tensor.reshape: 解释&#xff1a; 在p…...

GPT vs Claude到底如何选?

美国当地时间6月20日&#xff0c;OpenAI的“劲敌”Anthropic公司发布了最新模型Claude 3.5 Sonnet。据Anthropic介绍&#xff0c;该模型是Claude 3.5系列模型中的首个版本&#xff0c;也是Anthropic迄今为止发布的“最强大、最智能”的模型。它不仅在性能上超越了竞争对手和自家…...

基于C++实现的(控制台)双人俄罗斯方块小游戏

基于win32控制台应用程序的双人俄罗斯方块小游戏 1. 课题概述 1.1 课题目标和主要内容 使用visual studio 2015在win32控制台应用程序下用多线程实现双人同时进行俄罗斯方块的桌面游戏。最终将要完成的效果如图1.1所示&#xff0c;左右共两片工作区&#xff0c;也是游戏的主…...

Linux-虚拟环境

文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术&#xff0c;我们可以在系统中&#…...

uniapp开发微信小程序笔记10-触底加载

前言&#xff1a; 触底加载需求描述&#xff1a; 经常在做一些商品列表页的时候&#xff0c;如果一次性加载大量数据会影响性能&#xff0c;一般都是先加载10-20条&#xff0c;等用户向下滑到底部时再加载新的数据并渲染上去。 1、官方提供了一个API&#xff1a;onReachBott…...

Pytest --capture 参数详解:如何控制测试执行过程中的输出行为

--capture 选项用于控制测试用例执行过程中标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;的捕获行为。 --capture 的选项值&#xff1a; fd&#xff08;默认&#xff09; 捕获文件描述符级别的输出&#xff08;stdout 和 stderr&#x…...

JMeter实时性能压测可视化系统整合

一、相关工具简介: JMeter、Grafana 和 InfluxDB 结合实时地收集、分析和展示性能测试数据,进行更好地理解系统的性能表现,及时发现潜在问题并进行优化。 1,JMeter 实时生成性能数据,并将其发送到 InfluxDB 进行存储。2,InfluxDB 存储的数据。3,通过Grafana的仪表板,用…...

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…...

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…...

Qt开源控件:图像刻度轴绘制器 (附源码)工程项目私信博主

项目简介 图像刻度轴绘制器是一款基于 Qt/C 开发的小型绘图工具&#xff0c;旨在实现带有刻度轴的图像显示功能。该项目主要用于需要精确测量或标注图像坐标的场景。通过左侧和底部的坐标轴以及对应的刻度线&#xff0c;可以直观地了解图像内容在二维空间中的位置。 项目功能 …...

下载 M3U8 格式的视频

要下载 M3U8 格式的视频&#xff08;通常是 HLS 视频流&#xff09;&#xff0c;可以尝试以下几种方法&#xff1a; 方法 1&#xff1a;使用下载工具&#xff08;推荐&#xff09; 1. IDM&#xff08;Internet Download Manager&#xff09;&#xff1a; 安装 IDM 并启用浏…...

Mock.js的学习使用

Mock.js 介绍&#xff1a;是一个功能强大的JavaScript库&#xff0c;用于模拟接口请求和生成随机数据。 作用&#xff1a; 帮助开发者独立开发、前后端分离快速原型验证测试异常情况增加单元测试的真实性 原理&#xff1a; 通过拦截XMLHttpRequest或fetch等网络请求&#x…...

在 Windows Server 2022 Datacenter 上配置 MySQL 8.0 的主从复制

在 Windows Server 2022 Datacenter 上配置 MySQL 8.0 的主从复制。以下是详细的步骤&#xff1a; 1. 使用 root 用户登录 确保你以 root 用户登录到 MySQL 服务器。 mysql -u root -p输入你的 root 密码后进入 MySQL 命令行界面。 2. 配置主服务器 (master) 2.1 编辑 my.…...

6.1 innoDb逻辑存储结构和架构-简介

InnoDB 是 MySQL 默认的存储引擎&#xff0c;以其强大的事务支持、崩溃恢复能力和高效的数据处理能力广受欢迎。本文从逻辑存储结构、内存架构、磁盘结构到后台线程&#xff0c;逐步剖析 InnoDB 的关键概念&#xff0c;帮助您更好地理解和应用。 1. 逻辑存储结构 InnoDB 的数据…...

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…...

vue3项目最新eslint9+prettier+husky+stylelint+vscode配置

一、eslint9和prettier通用配置 安装必装插件 ESlint9.x pnpm add eslintlatest -DESlint配置 vue 规则 , typescript解析器 pnpm add eslint-plugin-vue typescript-eslint -DESlint配置 JavaScript 规则 pnpm add eslint/js -D配置所有全局变量 globals pnpm add globa…...

IOS ARKit进行图像识别

先讲一下基础控涧&#xff0c;资源的话可以留言&#xff0c;抽空我把它传到GitHub上&#xff0c;这里没写收积分&#xff0c;竟然充值才能下载&#xff0c;我下载也要充值&#xff0c;牛&#xff01; ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…...

【el-table】表格后端排序

在需要排序的列添加属性 sortable&#xff0c;后端排序&#xff0c;需将sortable设置为custom 如果需要自定义轮转添加 sort-orders 属性&#xff0c;数组中的元素需为以下三者之一&#xff1a;ascending 表示升序&#xff0c;descending 表示降序&#xff0c;null 表示还原为原…...

【iOS】多线程基础

【iOS】多线程基础 文章目录 【iOS】多线程基础前言进程与线程进程进程的状态进程的一个控制结构进程的上下文切换 线程为什么要用线程什么是线程线程和进程的关系线程的上下文切换 线程和进程的优缺点 小结 前言 笔者由于对于GCD不是很了解&#xff0c;导致了项目中网络请求哪…...

c#控制台项目的发布+相对路径的用法(绝对路径下素材丢失问题)

发布 生成 ->发布选定任务 生成了以后&#xff0c;素材需要手动拖过去 文件相对路径...

南非创业者劳拉:希望海南入境免签政策覆盖更多非洲国家

2025年是中国新一轮全面深化改革开放的&ldquo;落实起步&rdquo;之年,而位于中国最南端的海南省,是中国全面深化改革开放的试验区,正在紧锣密鼓推进自由贸易港封关运作,推进更高水平对外开放,世界目光正向这个中国面积最大的自由贸易港聚焦。在2025年海南省两会召开…...

钟建民:社会主义所有制要点是什么?与荣兆梓商榷

1月12日,从红昆仑策网读到了《荣兆梓:社会主义公有制及国家所有制的几个理论问题》(2025-01-12 来源: 昆仑策研究院 作者:荣兆梓)一文。在这篇文章中,荣兆梓教授就如何结合社会主义实践正确认识马克思的未来社会公有制、怎样概括社会主义公有制区别于共产主义高级阶段的…...

随便一个院长都能富可敌国?广东三甲医院院长拿2亿回扣,藏在屋子夹层里

前言:随便一个院长,不是富可敌国也是富甲一方。广东省高州市人民医院原党委书记、院长王茂生,为多家供应商在药品、耗材、医疗器械的采购以及工程建设等方面提供帮助,从中收受回扣,总计高达2亿余元。王茂生作为院长,在医院内部人事任命、资金使用、医药采购等方面有绝对的…...

几个小时候的游戏,竟赢得全球爆款剧

横空出世的《鱿鱼游戏》一举将蓬勃发展多年的韩剧推向了更广阔的全球观众这预示着全球影视市场的变化现象级爆款剧集《鱿鱼游戏》播出3年后,在全球期待中,续集《鱿鱼游戏2》终于上线。虽不如第一部惊艳,但这只&ldquo;鱿鱼&rdquo;依然再次搅动了全球剧集市场。2024年…...

歌曲与政治:由《最后一枪》所想到的

八十年代最后的那一年,北京并不平静,第二年,崔健在他的巡回演唱会中,唱起了《最后一枪》,唱毕,他问道:&ldquo;你们知道这首歌叫什么名字吗?&rdquo;听众答到&ldquo;叫《最后一枪》&rdquo;,崔健又道:&ldquo;那么我希望,去年的枪声,是最后一枪&am…...

中国人民银行将在港发行600亿元央行票据

新华社北京1月9日电(记者任军、吴雨)中国人民银行9日宣布,将于15日在香港招标发行2025年第一期中央银行票据,发行量为人民币600亿元。中国人民银行介绍,第一期中央银行票据期限6个月(182天),为固定利率附息债券,到期还本付息,发行量为人民币600亿元,起息日为2025年1…...