探索树堆Treap和红黑树的优势和劣势

探索树堆Treap和红黑树的优势和劣势

  • 一、背景知识
  • 二、树堆(Treap)的介绍
  • 三、红黑树(RB-Tree)的介绍
  • 四、树堆(Treap)与红黑树(RB-Tree)的比较
  • 总结

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


一、背景知识

树堆(Treap)和红黑树(RB-Tree)都是常见的自平衡二叉搜索树(self-balancing binary search tree)数据结构。
在这里插入图片描述

树堆是一种随机化平衡二叉搜索树,结合了二叉堆和二叉搜索树的特性。树堆的每个节点包含一个键值和一个随机优先级值。树堆的特点是通过维护键值的二叉搜索树性质和优先级的堆性质来保持平衡。通过保持这两个性质,树堆可以在插入和删除节点时自动进行平衡操作。树堆的优势在于它相对简单的实现和高效的查找操作。
在这里插入图片描述

红黑树是一种严格平衡的自平衡二叉搜索树。每个节点都具有一个额外的标记,称为颜色,可以是红色或黑色。红黑树通过遵循一组特定的规则来保持平衡,如保持从根节点到叶节点的任何路径上的黑色节点数量相同。通过这些规则,红黑树可以在插入和删除节点时自动进行平衡操作。红黑树的优势在于它提供严格的平衡性能保证,并且具有高效的查找、插入和删除操作。
在这里插入图片描述
区别:

  • 树堆通过随机优先级来维持平衡,而红黑树则通过颜色标记和旋转操作来维持平衡。
  • 树堆在实现和维护方面相对简单,而红黑树提供了严格的平衡保证。

探索树堆(Treap)和红黑树(RB-Tree)的优势和劣势的目的在于深入了解这两种常见的自平衡二叉搜索树数据结构,可以帮助我们优化和改进现有的数据结构,或者在需要特定性能要求的场景中提出新的数据结构设计。

二、树堆(Treap)的介绍

树堆(Treap)是一种组合了二叉堆和二叉搜索树特性的随机化平衡二叉树。它的基本特性和原理:

  1. 键值特性:树堆的每个节点包含一个键值和一个随机的优先级值。键值用于节点的比较和排序,优先级值用于平衡树的结构。

  2. 二叉搜索树性质:树堆维护了二叉搜索树的性质,即对于任意节点,它的左子树中的所有节点的键值小于该节点的键值,右子树中的所有节点的键值大于该节点的键值。

  3. 堆性质:树堆也维护了堆的性质,即对于任意节点,它的优先级值大于其子节点的优先级值。

  4. 随机化平衡:树堆通过随机生成节点的优先级值来实现平衡。节点的优先级值和键值无关,它的随机性保证了树的平衡性质。

  5. 插入操作:当插入一个新节点时,树堆首先按照二叉搜索树性质找到插入的位置,然后根据节点的优先级值,通过旋转操作保持堆性质和搜索树性质。

  6. 删除操作:删除一个节点时,树堆首先根据二叉搜索树性质找到要删除的节点,然后通过旋转操作将其删除,并保持堆性质和搜索树性质。

因此,树堆被广泛应用于各种需要动态操作集合的场景,如数据库索引、动态统计和优先级队列等。

树堆的优点:

  1. 随机化特性和平衡性。树堆通过随机化的方式维护平衡,在大多数情况下可以保持较好的性能,而不需要过多的平衡调整操作。
  2. 相对简单的实现,减少了开发和维护的复杂性。
  3. 提供高效的查找、插入和删除操作。树堆通过旋转操作和优先级调整,在插入和删除节点时能够自动进行平衡操作。相对于其他平衡树结构,树堆的插入和删除操作具有较低的时间复杂度。

简单的树堆(Treap)的C语言代码实现,以便更好地理解其工作原理:

#include <stdio.h>
#include <stdlib.h>// 定义树堆节点结构体
typedef struct treap_node {int key;int priority;struct treap_node* left;struct treap_node* right;
} TreapNode;// 初始化树堆节点
TreapNode* createNode(int key) {TreapNode* node = (TreapNode*)malloc(sizeof(TreapNode));node->key = key;node->priority = rand() % 100;  // 随机生成优先级值node->left = NULL;node->right = NULL;return node;
}// 左旋
void leftRotate(TreapNode** node) {TreapNode* newRoot = (*node)->right;(*node)->right = newRoot->left;newRoot->left = (*node);*node = newRoot;
}// 右旋
void rightRotate(TreapNode** node) {TreapNode* newRoot = (*node)->left;(*node)->left = newRoot->right;newRoot->right = (*node);*node = newRoot;
}// 树堆插入操作
void insert(TreapNode** root, int key) {if ((*root) == NULL) {*root = createNode(key);return;}if (key < (*root)->key) {insert(&((*root)->left), key);if ((*root)->left && (*root)->left->priority > (*root)->priority) {rightRotate(root);}} else {insert(&((*root)->right), key);if ((*root)->right && (*root)->right->priority > (*root)->priority) {leftRotate(root);}}
}// 前序遍历树堆
void preOrderTraversal(TreapNode* root) {if (root == NULL) {return;}printf("Key: %d, Priority: %d
", root->key, root->priority);preOrderTraversal(root->left);preOrderTraversal(root->right);
}int main() {TreapNode* root = NULL;// 插入节点insert(&root, 8);insert(&root, 5);insert(&root, 12);insert(&root, 3);insert(&root, 10);// 前序遍历输出树堆preOrderTraversal(root);return 0;
}

三、红黑树(RB-Tree)的介绍

红黑树本质上是一个二叉树。
在这里插入图片描述

红黑树在二叉树的基础上具备如下的性质:

  1. 每个结点是红的或者黑的。
  2. 根结点是黑的。
  3. 每个叶子结点是黑的。
  4. 如果一个结点是红的,则它的两个儿子都是黑的。
  5. 对每个结点,从该结点到其子孙结点的所有路径上的 包含相同数目的黑结点 。

满足以上性质的二叉树就是红黑树。其中第五条性质就决定了红黑树的平衡,它不像AVL树那样严格要求两边子树的高度差是1,而是要求黑色节点的高度一致即可。

从第四条和第五条的性质中,我们可以总结出一个数学结论:红黑树的根节点到叶子节点的最短路径与红黑树的根节点到叶子节点的最长路径之比是 1 : ( 2 × N − 1 ) 1 :(2\times N-1) 1:2×N1
在这里插入图片描述
红黑树的优点:

  1. 严格的平衡性能保证。红黑树通过遵循一组严格的规则来保持平衡,如保持从根节点到叶节点的任何路径上的黑色节点数量相同。这种平衡性能保证了红黑树的最坏情况时间复杂度为O(logN)。
  2. 高效的查找、插入和删除操作。由于红黑树是二叉搜索树,通过颜色标记和旋转操作来维持平衡,操作具有较低的时间复杂度。
  3. 作为一种高效的自平衡树结构,被用于实现C++ STL的map、set等数据结构,以及数据库索引、编译器实现、网络路由算法等领域。

四、树堆(Treap)与红黑树(RB-Tree)的比较

  • 红黑树和树堆在查找、插入和删除操作上的平均性能是相似的,都是O(log n)。这是因为它们都是自平衡的二叉搜索树,通过调整树的结构来维护平衡性,以确保这些操作的时间复杂度保持在对数级别。
  • 树堆的空间复杂度通常较低,适用于需要高效的优先队列操作的场景。而红黑树的空间复杂度较高,但由于其自平衡性质,它在搜索、插入和删除等操作上具有良好的性能。
  • 树堆的实现复杂度相对较低,特别是在插入和删除操作上。红黑树相对复杂一些,具有更好的平衡性,可以保证树的高度较小,从而在查找操作上表现更好。
  • 如果需要频繁的插入和删除操作,并且对查找操作的性能要求不是特别高,那么树堆可能是一个更好的选择,因为它们在动态插入和删除方面更有效率。如果对查找操作的性能要求较高,希望确保树的平衡性,或者需要一种稳定的数据结构,那么红黑树可能更适合,因为它们在保持平衡和查找操作上具有更好的性能保证。

总结

树堆(Treap)和红黑树(RB-Tree)都是用于实现有序集合或映射的数据结构,但它们各自具有一些不同的优劣势,取决于具体的应用场景和需求。

树堆(Treap)的优势:

  • 简单而高效的实现: 树堆的实现相对较简单,只需要维护两个关键属性:BST的有序性和堆的优先级。这使得它易于实现和理解。

  • 动态操作高效: 树堆在频繁的插入和删除操作方面表现出色,因为它们利用了随机的优先级来维护树的平衡,通常不需要进行复杂的平衡调整。

  • 随机性能好: 在随机输入的情况下,树堆的性能通常很好,因为优先级的随机性可以保持树的平衡。

树堆(Treap)的劣势:

  • 不适用于特定的有序数据: 当数据的顺序是特定的,而不是随机的时候,树堆的性能可能不如其他平衡树结构。

  • 空间开销较大: 每个节点需要存储两个额外的信息:优先级和子树的大小,这可能会增加内存开销。

红黑树(RB-Tree)的优势:

  • 稳定的性能: 红黑树在平均和最坏情况下都能提供稳定的性能保证,确保查找、插入和删除操作的时间复杂度都是O(log n)。

  • 适用于有序数据: 红黑树适用于各种数据分布,包括有序数据,因为它可以保持相对平衡的状态。

  • 没有随机性: 红黑树不依赖于随机性,因此在任何输入情况下都能提供一定程度的平衡性。

红黑树(RB-Tree)的劣势:

  • 相对复杂的实现: 红黑树的实现相对复杂,需要维护颜色信息和执行平衡操作,因此可能比树堆难以理解和实现。

  • 动态操作略慢: 在频繁的插入和删除操作时,红黑树的性能可能略低于树堆,因为它们需要进行平衡操作。

如果需要高效的动态操作,树堆可能更合适。如果需要稳定的性能和对有序数据的支持,红黑树可能更适合。

在这里插入图片描述

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

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

相关文章

Java空指针异常

在所有的RuntimeException异常中&#xff0c;Java程序员最熟悉的恐怕就是NullPointerException了。 NullPointerException即空指针异常&#xff0c;俗称NPE。如果一个对象为null&#xff0c;调用其方法或访问其字段就会产生NullPointerException&#xff0c;这个异常通常是由J…

单片机开发中的内存优化

在单片机开发中&#xff0c;内存优化是至关重要的&#xff0c;它不仅能够降低成本&#xff0c;还可以提高性能。本文将深入讨论如何在STM32单片机和C语言的环境中实施内存优化策略&#xff0c;以确保项目的顺利进行。 单片机内存资源通常包括RAM&#xff08;随机访问存储器&am…

wireshark抓包分析

题目一&#xff1a;Cephalopod(图片提取) 打开下载好的数据包&#xff1a;CtrlF 按照如图选择分组字节流&#xff0c;选择字符串&#xff0c;输入‘flag’筛选出数据包&#xff1b; 点击筛选出来的一条数据包&#xff0c;右键选择追踪tcp流&#xff1b; 然后可以看到png的字样…

渗透测试漏洞原理之---【CSRF跨站请求伪造】

文章目录 1、CSRF概述1.1、基本原理1.1.1、基本概念1.1.2、关键点1.1.3、目标 1.2、CSRF场景1.2.1、银行支付转账1.2.2构造虚假网站1.2.3、场景建模 1.3、CSRF类别1.3.1、POST方式 1.4、CSRF验证1.4.1、CSRF PoC Generator 2、CSRF攻防2.1、CSRF实战2.1.1、与XSS 漏洞相结合 2.…

获取Linux内核源码

在嵌入式平台上做Linux开发的时候&#xff0c;我们用的kernel都是芯片厂家移植到自家平台上的&#xff0c;但是最初的原生Linux内核的源码是从哪里来的呢&#xff1f;下面我们介绍一下怎么获取原生的Linux源码。 从Linux社区获取内核kernel源码 Linux社区的官方网站是 https:…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

Echart笔记

Echart笔记 柱状图带背景色的柱状图将X与Y轴交换制作为进度条 柱状图 带背景色的柱状图 将X与Y轴交换制作为进度条 //将X与Y轴交换制作为进度条 option { xAxis: {type: value,min:0,max:100,show:false,//隐藏x轴},yAxis: {type: category,data:[进度条],show:false,//隐…

【论文阅读】Pay Attention to MLPs

作者&#xff1a;Google Research, Brain Team 泛读&#xff1a;只关注其中cv的论述 提出了一个简单的网络架构&#xff0c;gMLP&#xff0c;基于门控的MLPs&#xff0c;并表明它可以像Transformers一样在关键语言和视觉应用中发挥作用 提出了一个基于MLP的没有self-attentio…

本地开机启动jar

1&#xff1a;首先有个可运行的jar包 本地以ruiyi代码为例打包 2&#xff1a;编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3&#xff1a;设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…

【算法与数据结构】404、LeetCode左叶子之和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;思路比较简单&#xff0c;遍历所有节点然后判断该节点是否为左叶子节点&#xff0c;如果是&#xff0c…

Flink的checkpoint是怎么实现的?

分析&回答 Checkpoint介绍 Checkpoint容错机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport alg…

【Selenium2+python】自动化unittest生成测试报告

前言 批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导入…

在windows下安装配置skywalking

1.下载地址 Downloads | Apache SkyWalkinghttp://skywalking.apache.org/downloads/ 2.文件目录说明 将文件解压后&#xff0c;可看到agent和bin目录&#xff1a; Agent&#xff1a;作为探针&#xff0c;安装在服务器端&#xff0c;进行数据采集和上报。 Config&#xff1a…

【SpringSecurity】十、JWT工具类

文章目录 1、jwt类库与相关依赖2、工具类3、总结 1、jwt类库与相关依赖 <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.11.0</version> </dependency>…

(三)行为模式:7、观察者模式(Observer Pattern)(C++示例)

目录 1、观察者模式&#xff08;Observer Pattern&#xff09;含义 2、观察者模式的UML图学习 3、观察者模式的应用场景 4、观察者模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现观察者模式的实例 1、观察者模式&…

Matlab(GUI程式设计)

目录 1.MatlabGUI 1.1 坐标区普通按钮 1.1.1 对齐组件 1.1.2 按钮属性 1.1.3 脚本说明 1.1.4 选择呈现 1.3 编译GUI程序 在以前的时候&#xff0c;我们的电脑还是这样的 随着科技的不断进步&#xff0c;我们的电脑也发生着翻天覆地的改变1990s&#xff1a; 在未来&#xff0c…

Mac 多版本jdk安装与切换

macOS上可以安装多个版本的jdk&#xff0c;方法如下&#xff1a; 1.下载jdk 在Oracle官网上下载不同版本的jdk&#xff1a; https://www.oracle.com/java/technologies/downloads/#java17 方案一 1.查看本机所有的jdk /usr/libexec/java_home -V3. 配置环境变量 打开bash_…

从零开发JavaWeb入门项目--十天掌握

原文网址&#xff1a;从零开发JavaWeb入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的JavaWeb入门项目实战&#xff0c;名字叫蚂蚁爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目&#xff0c;教程路线是&#xff1a;搭…

CSS使两个不同的div居中对齐的三种解决方案

在CSS中&#xff0c;有多种方法可以让两个不同的div居中对齐&#xff0c;包括相对定位和绝对定位。以下是两种常见的方法&#xff1a; 方法一&#xff1a;使用Flexbox Flexbox是一个用于创建灵活布局的CSS3模块。使用Flexbox&#xff0c;可以很容易地对元素进行居中对齐。 H…

wireshark 流量抓包例题

一、题目一(1.pcap) 题目要求&#xff1a; 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀&#xff08;加上下划线例如abc&#xff09; 4.第一个受害主机网站数据库的名字 看到题目SQL注入&#xff0c…