【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析
【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析
🔥个人主页:大白的编程日记
🔥专栏:C++笔记
文章目录
- 【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析
- 前言
- 一.红黑树的定义
- 1.1 红黑树的概念
- 1.2红黑树的规则
- 1.3 红黑树对比AVL树
- 二.红黑树的插入
- 2.1插入分析
- 2.1变色
- 2.2 旋转+变色
- 2.3 代码实现
- 三.红黑树的查找
- 四.红黑树的验证
- 4.1 思路分析
- 4.2 代码实现
- 后言
前言
哈喽,各位小伙伴大家好!上期我们讲了反向迭代器和计算器。今天我们来讲一下红黑树的深度剖析。话不多说,我们进入正题!向大厂冲锋
一.红黑树的定义
1.1 红黑树的概念
红黑树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保没有⼀条路径会比其他路径长出2倍,因而是接近平衡的。
1.2红黑树的规则
-
每个结点不是红色就是黑色
-
根节点是黑色的
-
如果⼀个结点是红色的,则它的两个孩子结点必须是黑色的,也就是说任意⼀条路径不会有连续的红色结点。
-
对于任意⼀个结点,从该结点到其所有NULL结点的简单路径上,均包含相同数量的黑色结点
这些都是红黑树。 -
说明:《算法导论》等书籍上补充了⼀条每个叶⼦结点(NIL)都是黑色的规则。他这里所指的叶子结点不是传统的意义上的叶子结点,而是我们说的空结点,有些书籍上也把NIL叫做外部结点。NIL是为了方便准确的标识出所有路径,《算法导论》在后续讲解实现的细节中也忽略了NIL结点,所以我们知道⼀下这个概念即可。
这棵树我们看可能以为是四条路径。
但是其实他是八条路径。
规定空节点是黑的符合红黑树的规则并且方便我们观察红黑树的路径。
由中这几点规则我们可以推出红黑树的性质:
- 最长路径<=2*最短路径
1.3 红黑树对比AVL树
红黑树的性能不如AVL树因为他没有那么严格地控制高度差。但是他的性能也不会太差,因为他控制最长路径<=2*最短路径。所以他的性能还是在logN的量级
红黑树的表达相对AVL树要抽象⼀些,AVL树通过高度差直观的控制了平衡。红黑树通过4条规则的颜色约束,间接的实现了近似平衡,他们效率都是同⼀档次,但是相对而言,插入相同数量的结点,红黑树的旋转次数是更少的,因为他对平衡的控制没那么严格。
总结:
-
查找
红黑树的性能稍逊一筹AVL树
因为他的高度控制没那么严格但都是logN量级。 -
插入
红黑树的性能要比AVL树好
虽然红黑树多了变色操作,但是变色操作简单,代价小。 并且红黑树高度控制没那么严格大量插入时旋转的调整次数比AVL树要少。所以插入是红黑树的性能更优秀。
二.红黑树的插入
2.1插入分析
- 插入⼀个值按⼆叉搜索树规则进行插入,插入后我们只需要观察是否符合红黑树的4条规则。
- 如果是空树插入,新增结点是黑色结点。如果是非空树插⼊,新增结点必须红色结点,因为非空树插入,新增黑色结点就破坏了规则4,规则4是很难维护的。
- 非空树插入后,新增结点必须红色结点,如果父亲结点是黑色的,则没有违反任何规则,插⼊结束
- 非空树插入后,新增结点必须红色结点,如果⽗亲结点是红⾊的,则违反规则3。进⼀步分析,c是红色,p为红,g必为黑,这三个颜色都固定了,关键的变化看u的情况,需要根据u分为以下几种情况分别处理。
说明:下图中假设我们把新增结点标识为c (cur),c的父亲标识为p(parent),p的父亲标识为g(grandfather),p的兄弟标识为u(uncle)。
2.1变色
c为红,p为红,g为黑,u存在且为红,则将p和u变黑,g变红。在把g当做新的c,继续往上更新。
分析:因为p和u都是红色,g是黑色,把p和u变黑,左边子树路径各增加⼀个黑色结点,g再变红,相当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题,需要继续往上更新是因为,g是红色,如果g的父亲还是红色,那么就还需要继续处理;如果g的父亲是黑色,则处理结束了;如果g就是整棵树的根,再把g变回黑色。
p是右子树也是一样的
所以p和cur在左还是在右我们并不关注。
只要u存在并且为红色我们都按照这种方式处理即可。
2.2 旋转+变色
如果u不存在或u存在为黑。
我们需要根据cur和p的位置分类讨论
- 单旋
c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c⼀定是新增结点,u存在且为黑,则c⼀定不是新增,c之前是黑色的,是在c的子树中插入,,变色将c从黑色变成红色,更新上来的。
分析:p必须变黑色,才能解决,连续红色结点的问题,u不存在或者是黑色的,这里单纯的变色无法解决问题,需要旋转+变色。
如果p是左子树并cur是左子树
如果p是g的左,c是p的左,那么以g为旋转点进行右单旋,再把p变黑,g变红即可。p变成课这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为p的父亲是黑色还是红色或者空都不违反规则。
如果p是右子树并cur是右子树
如果p是g的右,c是p的右,那么以g为旋转点进行左单旋,再把p变黑,g变红即可。p变成课这颗树新的根,这样i树黑色结点的数量不变,没有连续的红结点了,且不需要往上更新,因为p的父亲是黑色还是红色或者空都不违反规则。
那就是以g进行左单旋 在把g变红 p变黑。
- 双旋
如果p是左子树cur是右子树
如果p是g的左,c是p的右,那么先以p为旋转点进行左单旋,再以g为旋转点进行右单旋,再把c变黑,g变红即可。c变成课这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为c的父亲是黑色还是红色或者空都不违反规则。
如果p是右子树cur是左子树
如果p是g的右,c是p的左,那么先以p为旋转点进行右单旋,再以g为旋转点进行左单旋,再把c变黑,g变红即可。c变成课这颗树新的根,这样子树黑色结点的数量不变,没有连续的红色结点了,且不需要往上更新,因为c的父亲是黑色还是红色或者空都不违反规则。
2.3 代码实现
bool Insert(const k& x, const v& v)
{if (_root == nullptr)//插入根节点{_root = new node(x, v);return true;}node* cur = _root;node* parent = nullptr;//保留父亲节点while (cur){/*介质不冗余*/if (x < cur->_key){parent = cur;cur = cur->left;}else if (x > cur->_key){parent = cur;cur = cur->right;}else{return false;}}cur = new node(x, v);cur->col = RED;if (x > parent->_key){parent->right = cur;}else//相等插入左子树{parent->left = cur;}cur->parent = parent;while (parent&&parent->parent&&parent->col == RED){node* grandfather = parent->parent;if (parent == grandfather->left){node* uncle = grandfather->right;// g// p u// c c//u存在且为红if (uncle&&uncle->col==RED){parent->col = uncle->col=BLACK;grandfather->col = RED;cur = grandfather;parent = cur->parent;}//u不存在或存在为黑else{// g// p // cif (cur == parent->left){RoRateR(grandfather);parent->col = BLACK;grandfather->col = RED;}// g// p // celse{RoRateL(parent);RoRateR(grandfather);cur->col = BLACK;grandfather->col = RED;}break;}}else{node* uncle = grandfather->left;// g// u p // c c//u存在且为红if (uncle && uncle->col == RED){parent->col = uncle->col = BLACK;grandfather->col = RED;cur = grandfather;parent = cur->parent;}//u不存在或存在为黑else{// g// p // cif (cur == parent->right){RoRateL(grandfather);parent->col = BLACK;grandfather->col = RED;}// g// p // celse{RoRateR(parent);RoRateL(grandfather);cur->col = BLACK;grandfather->col = RED;}break;}}}_root->col = BLACK;//循环结束把根变黑return true;
}
三.红黑树的查找
红黑树的查找和AVL树的规则一样。
对比根节点和目标值的大小再取左子树或右子树查找。
node* Find(const k& x)
{node* ret = nullptr;node* cur = _root;while (cur){if (x < cur->_key){cur = cur->left;}else if (x > cur->_key){cur = cur->right;}else{ret = cur;//保留当前节点cur = cur->left;//继续向左子树查找中序的第一个}}return ret;
}
四.红黑树的验证
4.1 思路分析
我们检查红黑树主要检查是否满足红黑树的规则即可。
4.2 代码实现
bool check(node* cur,size_t tmp,size_t sum)
{if (cur == nullptr){if (tmp != sum){cout << "存在⿊⾊结点的数量不相等的路径" << endl;return false;}return true;}if (cur->col == RED){if (cur->parent->col == RED){cout << cur->_key << ":" << "存在连续红节点" << endl;return false;}}else{sum++;}return check(cur->left, tmp, sum) && check(cur->right, tmp, sum);
}
bool ISRBTree()
{return _ISRBTree(_root);
}
bool _ISRBTree(node* cur)
{if (cur == nullptr){return true;}if (cur->col == RED){return false;}size_t t = 0;while (cur){if (cur->col == BLACK){t++;}cur = cur->left;}return check(_root,t,0);
}
这里我们通过几组数据来看一下AVL树和红黑树的性能。
void Test()
{const int N = 100000;vector<int> v;v.reserve(N);srand(time(0));for (size_t i = 0; i < N; i++){v.push_back(rand() + i);}size_t begin2 = clock();AVL::AVLTree<int, int> t;for (auto e : v){t.Insert(e, e);}size_t end2 = clock();size_t begin3 = clock();RBTree::RBTree<int, int> t1;for (auto e : v){t1.Insert(e, e);}size_t end3 = clock();size_t begin1 = clock();// 确定在的值/*for (auto e : v){t.Find(e);}*/// 随机值for (size_t i = 0; i < N; i++){t.Find((rand() + i));}size_t end1 = clock();size_t begin4 = clock();for (size_t i = 0; i < N; i++){t1.Find((rand() + i));}size_t end4 = clock();cout << "AVLInsert:" << end2 - begin2 << endl;cout << "AVLTree:"<<t.IsBalanceTree() << endl;cout << "AVLHeight:" << t.Height() << endl;cout << "AVLSize:" << t.Size() << endl;cout << "AVLFind:" << end1 - begin1 << endl;cout << "RBInsert:" << end3 - begin3 << endl;cout << "RBTree:" << t1.ISRBTree() << endl;cout << "RBHeight:" << t1.Height() << endl;cout << "RBSize:" << t1.Size() << endl;cout << "RBFind:" << end4 - begin4 << endl;
}
- Debug
10万数据
100万数据
1000万数据
- Release
10万数据
100万数据
1000万数据
观察数据可以发现红黑树的查找比AVL要慢一些,
在release下查找效率都一样,因为CPU太快了。
但是红黑树在大量数据插入的情况下比AVL树要不少。
后言
这就是红黑树的深度剖析。大家自己好好消化!今天就分享到这!感谢各位的耐心垂阅!咱们下期见!拜拜~
相关文章:
【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析
【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析前言一.红黑树的定义1.1 红黑树的概念1.2红黑树的规则1.3 红黑树对比A…...
Mysql 性能优化:索引条件下推(ICP)
MySQL 索引下推(Index Condition Pushdown,ICP)是一种查询优化技术,旨在提高使用索引的查询效率。它是在 MySQL 5.6 中引入的,通过将部分 WHERE 子句的过滤条件下推到索引扫描阶段来减少不必要的回表操作,从…...
docker如何进入交互模式
目录 使用 docker run -it 使用 docker exec -it 示例: 使用 docker attach 示例: 在写代码的时候对小白来说避免不了本地和docker环境执行结果不一样的情况 这个时候需要进入正在运行的容器进行调试或执行一些命令操作。这时可以使用 Docker 提供的…...
闲谭SpringBoot--ShardingSphere分库分表探究
文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文,我们对日志表,进行了按月的分表,这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢,除了提高硬件性能,还有一…...
在Java中Semaphore的解释及主要用途
目录 定义 使用方法 主要用途 使用场景示例 定义 Semaphore(信号量)是Java并发编程中的一个同步工具类,用于控制对共享资源的访问。它通过维护一个计数器来管理多个线程对资源的并发访问数量。这个计数器表示当前可用的许可数,…...
React Native 项目 Error: EMFILE: too many open files, watch
硬件:MacBook Pro (Retina, 13-inch, Mid 2014) OS版本:MacOS BigSur 11.7.10 (20G1427) 更新: 删除modules的方法会有反弹,最后还是手动安装了预编译版本的watchman。 React Native 项目运行npm run web,出现如下错误:…...
四、VSCODE 使用GIT插件
VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git,就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …...
5 分布式ID
这里讲一个比较常用的分布式防重复的ID生成策略,雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库,分机房部署,单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…...
flink的EventTime和Watermark
时间机制 Flink中的时间机制主要用在判断是否触发时间窗口window的计算。 在Flink中有三种时间概念:ProcessTime、IngestionTime、EventTime。 ProcessTime:是在数据抵达算子产生的时间(Flink默认使用ProcessTime) IngestionT…...
T-SQL语言的函数实现
T-SQL语言的函数实现 在数据库管理系统中,函数是一种非常重要的编程结构。SQL Server支持多种类型的函数,包括标量函数、表值函数和系统函数。本文将详细介绍T-SQL中函数的实现,结合实际应用场景,帮助读者深入理解函数的使用方法…...
SpringBoot 使用 Cache 集成 Redis做缓存保姆教程
1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层,它简化了缓存的使用和管理。Spring Cache默认使用服务器内存,并无法控制缓存时长,查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…...
Delphi+SQL Server实现的(GUI)户籍管理系统
1.项目简介 本项目是一个户籍管理系统,用于记录住户身份信息,提供新户登记(增加)、户籍变更(修改)、户籍注销(删除)、户籍查询、曾用名查询、迁户记录查询以及创建备份、删除备份共8…...
Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包
1. 引言 在获取了 Ungoogled Chromium 的源代码之后,我们需要安装所有必要的依赖包。这些依赖包对于成功编译 Chromium 至关重要。本文将指导您完成所有必需软件包的安装。 2. 依赖包安装 2.1 使用 Homebrew 安装基础依赖 # 安装 Ninja 构建系统 brew install n…...
开放词汇检测新晋SOTA:地瓜机器人开源DOSOD实时检测算法
在计算机视觉领域,目标检测是一项关键技术,旨在识别图像或视频中感兴趣物体的位置与类别。传统的闭集检测长期占据主导地位,但近年来,开放词汇检测(Open-Vocabulary Object Detection-OVOD 或者 Open-Set Object Detec…...
json dump避免转义字符反斜杠
笔者在将json序列化到文件时,发现内容包含了反斜杠: [{"video": "MSRVTT-QA\/video_features\/7010.mp4","id": 170859},... ]解决办法是使用ensure_asciiFalse: json.dump(result_items, f, ensure_asciiFa…...
PL/SQL语言的正则表达式
PL/SQL语言的正则表达式详解 在现代软件开发中,数据处理和文本处理是至关重要的环节之一。尤其是在数据库操作中,使用正则表达式来处理字符串数据能大幅提高效率和灵活性。PL/SQL(Procedural Language/SQL)是Oracle数据库的过程性…...
C/C++中头文件time
在C/C中,<ctime>头文件提供了处理时间和日期的函数,这些函数允许你获取当前时间、计算时间差、格式化时间字符串等。以下是一些<ctime>头文件中常用函数的详细介绍和使用示例: time():获取当前时间。 time_t currentT…...
【.NET】Kafka消息队列介绍,使用Confluent.Kafka集成Kafka消息队列
一、Kafka介绍 kafka是一种高吞吐量、分布式、可扩展的消息中间件系统,最初由LinkedIn公司开发。随着不断的发展,在最新的版本中它定义为分布式的流处理平台,现在在大数据应用中也是十分广泛。 它可以处理大量的实时数据流,被广…...
图像处理|膨胀操作
在图像处理领域,形态学操作是一种基于图像形状的操作,用于分析和处理图像中对象的几何结构。**膨胀操作(Dilation)**是形态学操作的一种,它能够扩展图像中白色区域(前景)或减少黑色区域…...
kali安装
2024年最新kali Linux安装教程(超详细,图文并茂)_kali安装-CSDN博客 【2024年最新版】Kali安装详细教程-CSDN博客 Kali Linux 安装过程 超详细(图文并茂,通用版)-腾讯云开发者社区-腾讯云...
【Python3】异步操作 redis
aioredis 在高版本已经不支持了, 不要用 代码示例 redis 连接池异步操作redis以及接口 import asyncio from sanic import Sanic from sanic.response import json import redis.asyncio as redis from redis.asyncio import ConnectionPool# 创建 Sanic 应用 app…...
C++ vtordisp的应用场景
文章目录 问题代码1. 基本概念回顾2. 应用场景虚继承与虚函数并存的类层次结构 3. 编译器相关考虑 问题代码 #include <iostream> using namespace std;class base { public:base() {}virtual void show() { cout << "base:: show"<<endl; } priv…...
花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%
花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7% 数据集分割 训练组87% 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…...
递归构建树菜单节点
一、获取所有分类上下级信息 /*** 获取所有分类上下级信息*/ public R<List<ResearchTypeTreeVO>> getTypeTreeList(){//获取所有分类数据List<ResearchTypeVO> list ibResearchTypeService.getSuperList(null);List<ResearchTypeTreeVO> researchTy…...
物联网无线芯片模组方案,设备智能化交互升级,ESP32-C3控制应用
无线交互技术的核心在于实现设备之间的无缝连接和数据传输。在智能家居系统中,各种智能设备如智能灯泡、智能插座、智能门锁等,都通过无线网络相互连接,形成一个互联互通的生态。 用户可以通过语音助手、手机APP或其他智能终端,远…...
【Unity万人同屏插件】使用手册 保姆级教程 GPU动画 Jobs多线程渲染
【万人同屏插件】 基于Dots技术,高性能实现3D、2D Spine渲染、海量单位锁敌/碰撞检测。同时通过自定义BRG渲染器绕过对Entities包的依赖,也就是不用写ECS代码即可拥有Entities Graphics的高性能渲染,使用传统开发方式BRG接管Renderer组件。 …...
结合前端的响应式开发深入理解设备像素比
前端响应式开发中设备像素比是一个绕不开的概念,彻底理解这个概念,我们首先要梳理清楚屏幕设备的物理像素(Physical Pixel)、逻辑像素(Logical Pixel)以及css像素(px)之前的区别和联…...
QT c++ 按钮 样式 设置按下和松开的背景颜色
上一篇文章,需要自定义类,本文使用样式设置按下和松开的背景颜色。 1.头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h" #include <QVBoxLayout> //#include <QLinearGradient>…...
解决Docker冲突问题
错误:docker-ce-cli conflicts with 2:docker-1.13.1-210.git7d71120.el7.centos.x86_64 错误:docker-ce conflicts with 2:docker-1.13.1-210.git7d71120.el7.centos.x86_64 您可以尝试添加 --skip-broken 选项来解决该问题 您可以尝试执行:…...
C++之闭散列哈希表
目录 unordered_set和unordered_map 哈希概念 哈希表基本结构 哈希冲突 线性探测编辑 二次探测 前几期我们学习了红黑树和红黑树的模拟实现,最终使用红黑树封装了map和set。本期开始我们将学习下一个重要的知识点---哈希表,最终使用哈希表封装u…...
微信小程序map组件所有markers展示在视野范围内
注意:使用include-points属性不生效,要通过createMapContext实现 <template><view class"map-box"><map id"map" class"map" :markers"markers" :enable-traffic"true" :enable-poi&…...
Ubuntu平台虚拟机软件学习笔记
Ubuntu平台上常见虚拟机软件 VirtualBox [Download]KVM/QEMU 1. VirtualBox 1.1 查看安装版本 VBoxManage -V2. KVM/QEMU KVM: Kernel-based Virtual Machine QEMU: Quick EMUlator 通义千问: virt-manager 既不是QEMU也不是KVM,而是用于管理和创建…...
EasyExcel数据的导入导出
1.easyExcel简介 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 EasyExcel 的主要特点如下: 1、高性能:EasyExcel 采用了异…...
CSS Grid 布局全攻略:从基础到进阶
文章目录 一.Grid 是什么二.示例代码1. 基础使用 - 固定宽高2.百分百宽高3.重复设置-repeat4.单位-fr5.自适应6.间距定义其他 一.Grid 是什么 CSS 中 Grid 是一种强大的布局方式,它可以同时处理行和列 Grid 和Flex有一些类似,都是由父元素包裹子元素使用…...
C语言的语法
C语言的语法与应用探讨 C语言作为一种高效的程序设计语言,自1970年代问世以来,一直在科学计算、系统编程、嵌入式系统等领域中扮演着重要角色。本文将深入探讨C语言的基本语法、数据结构、控制结构以及其在实际应用中的重要性。 一、C语言基础 1.1 数…...
Go中的context 包使用详解
context 包在 Go 中非常重要,特别是在处理并发和超时的场景下,它能让你在多个 goroutine 之间传递取消信号、超时控制或其他控制信息。context 是 Go 并发模型中的一个重要工具,尤其适用于 HTTP 请求、数据库操作、分布式系统等场景。 1. 基…...
通俗易懂之线性回归时序预测PyTorch实践
线性回归(Linear Regression)是机器学习中最基本且广泛应用的算法之一。它不仅作为入门学习的经典案例,也是许多复杂模型的基础。本文将全面介绍线性回归的原理、应用,并通过一段PyTorch代码进行实践演示,帮助读者深入…...
机器学习模型评估指标
模型的评估指标是衡量一个模型应用于对应任务的契合程度,常见的指标有: 准确率(Accuracy): 正确预测的样本数占总样本数的比例。适用于类别分布均衡的数据集。 精确率(Precision): 在所有被预测为正类的样…...
嵌入式软件C语言面试常见问题及答案解析(三)
嵌入式软件C语言面试常见问题及答案解析(三) 上一篇已经足够长了,再长也就有点不礼貌了,所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者代码均代表个人的理解,如有不合理或者错误的地方,欢迎大家批评指正。 本文中题目列表 1. 编码实现子串定…...
LeetCode:165. 比较版本号(双指针 Java)
目录 165. 比较版本号 题目描述: 实现代码与解析: 双指针 原理思路: 165. 比较版本号 题目描述: 给你两个 版本号字符串 version1 和 version2 ,请你比较它们。版本号由被点 . 分开的修订号组成。修订号的值 是它…...
Golang中遇到“note module requires Go xxx”后的解决方案,不升级Go版本!
前几天,需要对一个两年前写的项目添加点儿新功能,需要用到一个 Http 客户端包,于是就用了 https://github.com/go-resty/resty 这个插件包。 我先是直接在项目根目录下执行了以下包的安装命令: go get -v github.com/go-resty/res…...
ubuntu编译ijkplayer,支持rmvb以及mkv
1. 准备环境 sudo apt-get update apt install gcc yasm cmake python p7zip-full vim pkg-config autoconf automake build-essential dos2unix mercurial cmake-curse-gui -y apt-get -y --force-yes install libass-dev libtheora-dev libtool libva-dev libvdpau-dev libv…...
mysql之sql的优化方案(重点)
1、全字段匹配是最棒的 假如一个Staffs 这个表,将 name,age ,pos 组合成了一个联合索引,在where条件下,能够使用到的索引越多越好。 EXPLAIN SELECT * FROM staffs WHERE NAME July; EXPLAIN SELECT * FROM staffs WHERE NAME July AND age…...
使用Qt实现json数据的格式检测并序列化输出 Qt5.4.0环境
问题: 使用 Qt 实现 JSON 数据的格式检测,并输出各个键值 代码: widget.h #include <QWidget> #include <QJsonDocument> /*序列化 反序列化(F1查看帮助文档)*/ #include <QJsonObject> /*利用对象代表了一段json数据*/ …...
Internet协议原理
文章目录 考试说明Chapter 0: 本书介绍Chapter 1: Introduction And Overview 【第1章:引言与概述】Chapter 2: Overview Of Underlying Network Technologies 【第2章:底层网络技术的回顾】Chapter 3: Internetworking Concept And Architectural Model…...
国标GB28181-2022视频平台EasyGBS小知识:局域网ip地址不够用怎么解决?
在局域网中,IP地址不足的问题通常不会在小型网络中出现,但在拥有超过255台设备的大型局域网中,就需要考虑如何解决IP地址不够用的问题了。 在企业局域网中,经常会出现私有IP地址如192.168.1.x到192.168.1.255不够用的情况。由于0…...
CentOS 使用 yum 方式安装 Nginx
CentOS 使用 yum 方式安装 Nginx 文章目录 CentOS 使用 yum 方式安装 Nginx1、Nginx 安装前提条件步骤 1:更新系统软件包步骤 2:查看 Nginx 相关的软件包步骤 3:安装 Nginx步骤 4:启动并启用 Nginx步骤 5:验证 Nginx 是…...
Spring Boot教程之五十一:Spring Boot – CrudRepository 示例
Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。由于其快速的生产就绪环境,使开发人员能够直接专注于逻辑,而不必费力配置和设置,因此如今它正成为开发人员的最爱。Spring Boot 是…...
消息队列:原理、问题与设计全解析
1.如何保证消息的顺序性 保证消息顺序性通常是在分布式系统或网络通信中遇到的一个挑战。以下是几种常见的方法来确保消息的顺序性: 单生产者单消费者模型: 如果系统设计为只有一个生产者和一个消费者,那么保持消息顺序相对简单,…...
成功!QT 5.15.2编译mysql驱动
首选要说明,5.15与6.7编译驱动是完全不同的。搞错了永远编译不出来。 参考 主要是参考安装QT,安装mysql等。 编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)_mingw编译qt6.7-CSDN博客 复制mysql的include和lib到一个方便的目…...