文章目录

  • 一、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分成的四个区间中)
    • 总而言之:就是要保持对称顺序和很好的平衡

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相关推荐

  1. 从二叉查找树到平衡树:avl, 2-3树,左倾红黑树(含实现代码),传统红黑树...

    参考:自平衡二叉查找树 ,红黑树, 算法:理解红黑树 (英文pdf:红黑树) 目录 自平衡二叉树介绍 avl树 2-3树 LLRBT(Left-leaning red-black tree左倾红黑树 ...

  2. 左倾红黑树Go语言实现

    文章目录 左倾红黑树的定义 红黑树性质 Node数据结构 旋转 插入 颜色转换 删除 实现 Keys Contains DeleteMin.DeleteMax Rank.Get Ceil Floor ...

  3. 红黑树进阶—左倾红黑树(LLBR)介绍

    红黑树已经有很长的历史,在许多现代编程语言的符号表中都有使用,但是其缺点也很明显,其代码实现过于繁杂.因此出现的红黑树的修改版--左倾红黑树 左倾红黑树的代码实现相比于典型的红黑树来说要简单不少,但是 ...

  4. 左倾红黑树的原理及简单实现

    (注:以下图片全部源于<算法 第4版>) 左倾红黑树的原理及简单实现 左倾红黑树的简介 左倾红黑树的定义 左倾红黑树与2-3树的对比 左倾红黑树的颜色表示 左倾红黑树的一些基本操作 1.颜 ...

  5. 左倾红黑树的go语言实现

    简介 红黑树经常能在计算机底层代码中见到,比如 C++的map,multimap, set, multiset Linux中rdtree用以管理内存和进程 Java中的HashMap 左倾红黑树是对红 ...

  6. 数据结构——左倾红黑树

    左倾红黑树 前提了解 红黑树和平衡多叉树的对应关系 左倾红黑树 基于自顶向下2-3-4树的左倾红黑树 基于2-3树的左倾红黑树 重要代码 左右旋转变色 翻转变色 向2-3左倾红黑树插入 向2-3-4左 ...

  7. 从2-3树谈到左倾红黑树

    2-3树 定义 顾名思义,2-3树,就是有2个儿子或3个儿子的节点.2-3树就是由这些节点构成.所以2-3-4树的每个节点都是下面中的一个: 空节点:空节点. 2-节点:包含一个元素和两个儿子. 3- ...

  8. 左倾红黑树(LLRBT)删除操作及相关性质总结答疑

    Left-leaning Red Black Tree 看算法4(算法 第4版 Algorithms 4th Edition)3.4节时,后面的习题有实现左倾红黑树删除操作的代码,刚开始看得云里雾里的 ...

  9. 数据结构之 红黑树(左倾红黑树) java实现

    为啥要有红黑树 上一章我们聊到了二叉查找树数,但是二叉查找树在 插入的时候 如果 递增插入或者递减插入 ,就会导致这个棵树 单边倾斜,或者说单边增长从而退化成链表而影响查询效率,如下图 从而引进了红黑 ...

最新文章

  1. UDP 构建p2p打洞过程的实现原理(持续更新)
  2. hdfs源码分析第一弹
  3. java中map的put方法,Java TreeMap put()方法
  4. 从数据类型 nvarchar 转换为 numeric 时出错_JS入门篇(三):javascript的数据类型详解...
  5. 安装vue-cli脚手架
  6. 【跃迁之路】【590天】程序员高效学习方法论探索系列(实验阶段347-2018.09.18)...
  7. python工资这么高为什么不学-现在Python就业薪资高吗?
  8. android系统预制app/bin/.so文件及文件夹
  9. Unity3D研究院之2D游戏开发制作原理(二十一) 【转】
  10. R语言绘图的中文字体处理
  11. 【百度网盘】 个人资源共享
  12. python实现四参数七参数坐标转换
  13. C++_MFC读视频文件
  14. Centos文件清理
  15. matlab做胶州湾地图,惊了,青岛也有了五环地图,快来看你家在几环?
  16. 优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则
  17. python笔记05: 程序结构
  18. selenium控制日历控件
  19. 计算机网络虚电路数据报,计算机网络——网络层-虚电路和数据报网络
  20. JavaScript交互式网页设计 • 【第2章 JavaScript函数与事件】

热门文章

  1. php视频转音频文件怎么打开,视频怎么转音频格式 MP4格式怎样转MP3格式
  2. oracle导入dmp秒退,Oracle导入dmp遇到问题解决
  3. 安国论—富国篇:金融战争与美元霸权(1)
  4. Win10电脑清除运行窗口的历史记录
  5. 木材加工 解题报告
  6. 西北师范大学计算机科学与工程学院院长,西北师范大学计算机科学与工程学院.doc...
  7. ffmpeg压缩视频
  8. proble tip
  9. Unity IOS游戏内好评
  10. 电商服务器性能测试,如何测试分析电商网站的性能瓶颈(一)