探索树堆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.mzph.cn/news/65647.shtml

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

相关文章

【Mysql问题集锦】:Can‘t create table ‘#sql-58d7_431d‘ (errno: 28)

问题描述&#xff1a; 问题原因&#xff1a; OSError: [Errno 28] No space left on device&#xff0c;即&#xff1a;磁盘空间不足&#xff0c;无法创建文件。因此&#xff0c;导致Mysql无法执行SQL语句。 问题解法&#xff1a; Step 1&#xff0c;查看有哪些目录占用了大量…

已解决“SyntaxError: invalid character in identifier“报错问题

本文摘要&#xff1a;本文已解决 Python FileNotFoundError 的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领…

vmware虚拟机(ubuntu)远程开发golang、python环境安装

目录 1. 下载vmware2. 下载ubuntu镜像3. 安装4. 做一些设置4.1 分辨率设置4.2 语言下载4.3 输入法设置4.4 时区设置 5. 直接切换管理员权限6. 网络6.1 看ip6.2 ssh 7. 本地编译器连接远程服务器7.1 创建远程部署的配置7.2 文件同步7.3 远程启动项目 8. ubuntu安装golang环境8.1…

SQL查询本年每月的数据

--一、以一行数据的形式&#xff0c;显示本年的12月的数据&#xff0c;本示例以2017年为例&#xff0c;根据统计日期字段判断&#xff0c;计算总和&#xff0c;查询语句如下&#xff1a;selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

初探---Qt

目录 一、介绍Qt 二、软件安装 三、QT工具介绍 四、Assistant帮助文档的使用 五、设计师界面的介绍 ​编辑 六、QT工程项目各文件初始程序的介绍 1> 配置文件&#xff1a;.pro文件 2> 头文件 3> 源文件 4> 主程序 5> 各文件之间调用方式 七、第一个…

【LeetCode】双指针妙解有效三角形的个数

Problem: 611. 有效三角形的个数 文章目录 题目分析讲解算法原理复杂度Code 题目分析 首先我们来分析一下本题的思路 看到题目中给出的示例 题目的意思很简单&#xff0c;就是将给到的数字去做一个组合&#xff0c;然后看看这三条边是否可以构成三角形。那判断的方法不用我说&a…

【LeetCode75】第四十四题 省份数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个二维数组&#xff0c;表示城市之间的连通情况&#xff0c;连在一起的城市为一个省份&#xff0c;问我们一共有多少个省份。 这…

CNN 01(CNN简介)

一、卷积神经网络的发展 convolutional neural network 在计算机视觉领域&#xff0c;通常要做的就是指用机器程序替代人眼对目标图像进行识别等。那么神经网络也好还是卷积神经网络其实都是上个世纪就有的算法&#xff0c;只是近些年来电脑的计算能力已非当年的那种计算水平…

Swift 如何从图片数据(Data)检测原图片类型?

功能需求 如果我们之前把图片对应的数据(Data)保持在内存或数据库中,那么怎么从 Data 对象检测出原来图片的类型呢? 如上图所示:我们将 11 张不同类型的图片转换为 Data 数据,然后从 Data 对象正确检测出了原图片类型。 目前,我们的代码可以检测出 jpeg(jpg), tiff,…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能&#xff0c;怎么实现&#xff0c;提供一份整体逻辑&#xff1a;包括主函数和功能函数 主函数逻辑&#xff1a; 1. 读图,两张rgb&#xff08;cv::imread&#xff09; 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数&#xff1a;keypoints…

VMware 安装 Centos7 超详细过程

CentOS系统&#xff0c;安装教程可参考以下&#xff1a; 哪些模型需要在Linux下运行&#xff0c;需提前预装Linux系统呢&#xff0c;评论区讨论吧 比如Noah-MP 5.0模型 1.软硬件准备 软件&#xff1a;推荐使用 VMware&#xff0c;我用的是 VMware 12 镜像&#xff1a;CentO…

【python爬虫】10.指挥浏览器自动工作(selenium)

文章目录 前言selenium是什么怎么用设置浏览器引擎获取数据解析与提取数据自动操作浏览器 实操运用确认目标分析过程代码实现 本关总结 前言 上一关&#xff0c;我们认识了cookies和session。 分别学习了它们的用法&#xff0c;以及区别。 还做了一个项目&#xff1a;带着小…

MTK6761/MT6761安卓核心板4G安卓智能模块详细参数性能介绍

MTK6761 安卓核心板采用12nm制程四核Cortex-A53、最高主频2.0GHZ 处理器&#xff0c;板载内存为 1GB8GB(2GB16GB、3GB32GB、4GB64GB)&#xff0c;搭载Android 9.0操作系统。 MTK6761&#xff08;曦力 A22&#xff09;安卓核心板基本概述 MTK6761安卓核心板 是一款高性能低功耗…

【算法奥义】最大矩形问题

首先建立一个二维数组&#xff0c;这个二维数组&#xff0c;计算出矩阵的每个元素的左边连续 1 的数量&#xff0c;使用二维数组 left记录&#xff0c;其中left[i][j] 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。 也就是从这个元素开始&#xff0c;从右往左边数有多少个连…

Socks5代理 vs. Socks4代理:特点和区别解析

在网络通信中&#xff0c;使用代理服务器可以提供更安全、匿名的连接。其中&#xff0c;Socks5和Socks4是两种常见的代理协议。本文将深入探讨它们之间的特点和区别&#xff0c;帮助您选择适合自己需求的代理类型。 1.特点概述 -Socks5&#xff08;Socket Secure 5&#xff0…

SpringCloudGateway集成SpringDoc

SpringCloudGateway集成SpringDoc 最近在搞Spring版本升级&#xff0c;按客户要求升级Spring版本&#xff0c;原来用着SpringBoot 2.2.X版本&#xff0c;只需要升级SpringBoot 2.X最新版本也就可以满足客户Spring版本安全要求&#xff0c;可是好像最新的SpringBoot 2.X貌似也不…

【Apollo学习笔记】——规划模块TASK之SPEED_DECIDER

文章目录 前言SPEED_DECIDER功能简介SPEED_DECIDER相关配置SPEED_DECIDER流程MakeObjectDecisionGetSTLocationCheck类函数CheckKeepClearCrossableCheckStopForPedestrianCheckIsFollowCheckKeepClearBlocked Create类函数 前言 在Apollo星火计划学习笔记——Apollo路径规划算…

Java-API简析_java.net.Inet4Address类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132643590 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…

Linux线程控制

目录 一、线程创建 1.1 pthread_create 1.2 线程传入启动函数参数方式 二、线程退出(pthread_exit函数 pthread_cancel函数) 三、线程等待 3.1 为什么要线程等待&#xff1f; 3.2 pthread_join函数 四、线程分离 4.1 pthread_detach() 和 pthread_self() 五、pthread库…