Week 5.1 | 左倾红黑树LLRB | Princeton Algorithms
文章目录
- 一、2-3 search trees
- 1. 定义
- 2. 操作
- 3. 复杂度
- 二、左倾红黑树LLRB
- 1. 定义
- 2. 实现
- (1)查找
- (2)红黑树节点表示
- (3)左旋
- (4)右旋
- (5)翻转颜色
- (6)插入
- 3. 复杂度
- 三、B-trees
- 1. 定义
- 2. 实现
- 3. 复杂度
一、2-3 search trees
上一节中讲述了BST的实现和性能,但其增删改查的复杂度最坏情况为N。如何得到最坏情况也为logN的结构呢?
1. 定义
2. 操作
搜索K
递归实现
比较当前节点key与搜索key的大小;再找到搜索key所在区间;顺着link进入下一个节点插入K
- 在2-node中插入(2-node即该节点中只有1个key):
首先查找K所在位置,如果查找到的最后一个节点是2-node,则将2-node替换成3-node
K < M, K > J, K < L
- 在3-node中插入(2-node即该节点中有2个key):
・Add new key to 3-node to create temporary 4-node.
・Move middle key in 4-node into parent.
・Repeat up the tree, as necessary.
・If you reach the root and it’s a 4-node, split it into three 2-nodes
例:插入L,首先找到L的位置,L在E和R之间,在H和P之间
将L插入到3-node节点的对应位置,创造一个暂时的4-node节点
将4-node节点的中间key移动到父节点的对应位置中,分开剩下两个key。循环这一步直到能够将中间节点插入到为2-node父节点中;或者到达root
到达root的话,就将root的4-node节点分成三个2-node节点(4-node节点意味着,其四个子节点,分别在4-node节点的3个key分成的四个区间中)
- 总而言之:就是要保持对称顺序和很好的平衡
- 在2-node中插入(2-node即该节点中只有1个key):
3. 复杂度
当插入新节点时,如果需要更新树的深度,底部不动,在原根节点上再加一个新的根节点,所有的树的原节点的深度都+1. 这样就保证,从root到每一个底部节点都是一样的长度。
但实现起来太麻烦。使用红黑树实现这一思想。
二、左倾红黑树LLRB
1. 定义
主要思想是使用BST来表示2-3 tree。整体仍然符合BST的规则(每个节点有两个子节点、左边小右边大),但加入了link的颜色的设计。
红线所连接的两个节点,等价于2-3 tree中的一个3-node节点。可以将红线所连接的节点视为一个整体,黑线连接各个整体。
这里定义中所提到的三条规则,都需要在LLRB的代码中实现对应的方法来维护这三条规则,对应的方法是:
2. 实现
(1)查找
查找、floor、遍历、select等操作都和基础BST一样。
(2)红黑树节点表示
(3)左旋
该方法的主要目的是维护LLRB的rule之一:红线必须是左倾的。
(4)右旋
该方法辅助了插入方法,帮助维护了LLRB的rule。
(5)翻转颜色
当4-node情况时(即一个整体中有3个key,4个子节点),翻转颜色 等价于 分离这3个key。
(6)插入
从(3)-(5)都是插入的辅助方法,帮助维护LLRB的顺序。
- 当要插入2-node节点时:
- 当要插入3-node节点时:
- 实现:
总结以上情况,虽然看似情况很多,但实际上就三种情况:
右边link红,左边link黑,就左旋;
左边link、左子节点的左边link都为红,右旋;
两边link都红:翻转颜色
3. 复杂度
红黑树能最大可能地保持树的平衡、减低树的深度。因为插入时,会不断旋转来保持左右平衡。
三、B-trees
1. 定义
主要idea是,使用page来储存一大段连续的有序数据,而在搜索时,只需要找到一页page的第一个数据(即probe),再在page中查找即可。这样可以让树的深度非常浅。
该模型,找probe的时间比找page中数据的时间大多了。(我的理解是,在page数组中找数据,只需要用二分法即可。而probe则需要多次跟其他probe比较,才能确认搜索目标在哪个probe指向的page中)
所以目标就是尽可能减少probe个数,增大page中存储数据的个数。
每个黑色字母的有序数组就代表一个page,黑色字母才是客户存储进来的数据。而数组的最小元素被存储在其父节点的数组中,作为probe,也即红色字母用于作为搜索时的向导,而不是客户需要使用的数据。
每个存储probe的数组(设一个page存储的最大数据量为M,则每个数组的长度都为M),都可以存储M-1个probe和M-1个对应的link,指向子节点。与二叉树相同,每个子节点数组,其中全部数据都在父节点的两个key的中间、或全部小于最小key、或全部大于最大key。
2. 实现
- 搜索:
- 插入:
- 插入图示
每一行显示了在一个page中插入一个key的结果。
每一行都是最底层的page数组,用于存储数据。上层的probe数组没有显示。
3. 复杂度
Week 5.1 | 左倾红黑树LLRB | Princeton Algorithms相关推荐
- 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树...
参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...
- 左倾红黑树Go语言实现
文章目录 左倾红黑树的定义 红黑树性质 Node数据结构 旋转 插入 颜色转换 删除 实现 Keys Contains DeleteMin.DeleteMax Rank.Get Ceil Floor ...
- 红黑树进阶—左倾红黑树(LLBR)介绍
红黑树已经有很长的历史,在许多现代编程语言的符号表中都有使用,但是其缺点也很明显,其代码实现过于繁杂.因此出现的红黑树的修改版--左倾红黑树 左倾红黑树的代码实现相比于典型的红黑树来说要简单不少,但是 ...
- 左倾红黑树的原理及简单实现
(注:以下图片全部源于<算法 第4版>) 左倾红黑树的原理及简单实现 左倾红黑树的简介 左倾红黑树的定义 左倾红黑树与2-3树的对比 左倾红黑树的颜色表示 左倾红黑树的一些基本操作 1.颜 ...
- 左倾红黑树的go语言实现
简介 红黑树经常能在计算机底层代码中见到,比如 C++的map,multimap, set, multiset Linux中rdtree用以管理内存和进程 Java中的HashMap 左倾红黑树是对红 ...
- 数据结构——左倾红黑树
左倾红黑树 前提了解 红黑树和平衡多叉树的对应关系 左倾红黑树 基于自顶向下2-3-4树的左倾红黑树 基于2-3树的左倾红黑树 重要代码 左右旋转变色 翻转变色 向2-3左倾红黑树插入 向2-3-4左 ...
- 从2-3树谈到左倾红黑树
2-3树 定义 顾名思义,2-3树,就是有2个儿子或3个儿子的节点.2-3树就是由这些节点构成.所以2-3-4树的每个节点都是下面中的一个: 空节点:空节点. 2-节点:包含一个元素和两个儿子. 3- ...
- 左倾红黑树(LLRBT)删除操作及相关性质总结答疑
Left-leaning Red Black Tree 看算法4(算法 第4版 Algorithms 4th Edition)3.4节时,后面的习题有实现左倾红黑树删除操作的代码,刚开始看得云里雾里的 ...
- 数据结构之 红黑树(左倾红黑树) java实现
为啥要有红黑树 上一章我们聊到了二叉查找树数,但是二叉查找树在 插入的时候 如果 递增插入或者递减插入 ,就会导致这个棵树 单边倾斜,或者说单边增长从而退化成链表而影响查询效率,如下图 从而引进了红黑 ...
最新文章
- UDP 构建p2p打洞过程的实现原理(持续更新)
- hdfs源码分析第一弹
- java中map的put方法,Java TreeMap put()方法
- 从数据类型 nvarchar 转换为 numeric 时出错_JS入门篇(三):javascript的数据类型详解...
- 安装vue-cli脚手架
- 【跃迁之路】【590天】程序员高效学习方法论探索系列(实验阶段347-2018.09.18)...
- python工资这么高为什么不学-现在Python就业薪资高吗?
- android系统预制app/bin/.so文件及文件夹
- Unity3D研究院之2D游戏开发制作原理(二十一) 【转】
- R语言绘图的中文字体处理
- 【百度网盘】 个人资源共享
- python实现四参数七参数坐标转换
- C++_MFC读视频文件
- Centos文件清理
- matlab做胶州湾地图,惊了,青岛也有了五环地图,快来看你家在几环?
- 优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则
- python笔记05: 程序结构
- selenium控制日历控件
- 计算机网络虚电路数据报,计算机网络——网络层-虚电路和数据报网络
- JavaScript交互式网页设计 • 【第2章 JavaScript函数与事件】