Chapter11 搜索树-红黑树-B-树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、索引顺序访问方法
索引顺序表:在建立顺序表的同时,建立一个索引项, 包括两项:关键字项和指针项。索引表按关键字有序, 顺序表则为分块有序。 顺序表
0 17 1 08 2 21 3 19 4 14 5 31 6 33 7 22 8 25 9 40 10 52 11 61 12 78 13 46
…… ……
它是在1972年由鲁道夫· 贝尔发明的,他称之为“对称二叉 B树”,它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的; 特点: 利用对树中的结点 “红黑着色”的要求,降低了平衡性 的条件,达到局部平衡, 有着良好的最坏情况运行时间,它可以在O(logn)时间内 做查找,插入和删除,这里的n是树中元素的数目。
适用于外部字典的ISAM
数据组织:可用的磁盘空间被划分为很多块,I/O 的单位;字典元素以升序存储在块中 顺序访问:依次输入各个块,在每个块中按升序搜 索元素。如果每个块包含 m个元素,则搜索每个元 素所需要的磁盘访问次数为 1/m 随机访问:采用索引机制,驻留内存;索引中包含 的关键值数量与块数相同,包含每个块中的最大关 键值;
索引顺序访问-ISAM(续2)
跨磁盘的字典访问方法:首先需在磁盘索引中进 行搜索以判断所需要的记录可能存储在哪个磁盘 上;找到磁盘后,取出相应磁盘的块索引,并在 其中搜索所需要的的块;块被取出后,在其内部 搜索所需要的记录;
优点:提供外部字典的较好的顺序和随机访问;
缺点:插入/删除时,在块之间移动元素的代价高; 可采用预留空间的方法减少移动。
数据结构与算法
2010年秋季
Chapter11 搜索树
内容提要
11.1 二叉搜索树 11.2 AVL树 11.3 红黑树 11.4 B-树 11.5 应用
补充:扩充二叉树
增加了外部节点,用于替代树中的空子树。
用外部节点替换每一个空指针。
1、红黑树定义
Red-Black tree, 简称RB-Tree;
2、红黑树性质
结点的阶(Rank):平衡性指标 从该结点到其子树中任意外部结点的任一条路径上的黑 色结点的数量 不包括该结点本身,包括叶结点! 外部结点的阶为零 根结点的阶:树的阶
R=2
R=2 R=1 R=1
R=1
红黑树性质
设r是红黑树的阶,h是红黑树的高 度(不包括外部结点),n是内部 节点的个数 性质1:r ≤ h ≤ 2r 性质2:n ≥ 2r-1,最少是满二叉 树 性质3:h ≤ 2log2(n+1) 结论: 红黑树搜索、插入、删除的时间 复杂度为O(logn)
结点删除后,问题是: 解决“双黑”结点现象 讨论前提:双黑结点是待删结点的左子节点(右子节点对称 处理即可) 有三种情况: 双黑结点的兄弟结点是黑色,且子结点有红色 双黑结点的兄弟结点是黑色,且有两个黑色子结点 双黑结点的兄弟结点是红色
情况1:第一种
双黑结点与其红色侄子“八字形外撇” 解决方法:单旋转 将兄弟结点C提上去 C继承原来父节点B的颜色 把B着为黑色,D着为黑色,其他颜色不变
• 以c0为根的子树中的元素关键值小于k1,
• 以cp为根的子树中的元素关键值小于kp, • 并且以ci为根的子树中的元素关键值大于ki而小于ki+1,其中 1≤i≤p
七叉树示例
根包含2个元素和3个子女 中间的子女有6个元素和7个孩子,其中6个孩子是外部节点
红黑树的应用
典型的用途是:关联数组;
C++ STL中的关联式容器:集合set、多重集合multiset、映 射map、多重映射multimap等均采用了红黑树的变体;
set<int> s; map<int, string>s
在Linux内核中,用于组织虚拟区间的数据结构也是红黑树; 代码参见: • • linux/include/linux/rbtree.h linux/lib/rbtree.c
换色调整示例
插入4:首先调用BST的插入算法,
LLr型 父祖换色
换色调整示例(1)
LRb型 旋转
换色调整示例(2)
插入代码描述
使用BST插入算法,插入新结点z 把z标记为红色 While doubleRed(z) if isBlack(sibling(parent(z))) z←restructure(z) return else {sibling(parent(z) is red } z←recolor(z)
80
直接删除,把该 结点变为叶结点
结点删除示例(2)
删除80
不平衡
80
情况3:兄弟结点是红色
结点删除示例(3)
情况3:兄弟结点是红色
转换为情况1
结点删除示例(4)
情况1:兄弟结点是黑色,且有红色子结点 同边顺:将D提上去成为子根结点,继承原子 根B的颜色,B着为黑色
红黑树插入、删除算法总结
索引ຫໍສະໝຸດ Baidu序查找的过程
索引表 22 48 86 1 7 13
查38
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 53
ASLbs Lb Lw 其中:Lb — —查找索引表确定所在 块的平均查找长度 Lw — —在块中查找元素的平 均查找长度
红黑树的定义
平衡的扩充二叉搜索树,满足下面条件:
颜色特征:每个结点为“黑色”或“红色”;
根特征:根结点永远是“黑色”的; 外部特征:扩充外部叶结点都是空的“黑色”结点; 内部特征:“红色”结点的两个子结点都是“黑色”的, 即:不允许两个连续的红色结点; 深度特征:对于每个结点,从该结点到其所有子孙叶结点 的路径中所包含的黑色结点数量必须相同。
单旋转调整
双黑节点:X
红色侄子:D
情况1:第二种
双黑结点与其红色侄子“同边顺” 解决方法:双旋转 将D结点旋转为C结点的父结点,转为情况1(a) 再将D提上去作为根结点,继承原来子根B的颜色,B 着为黑色
双旋转调整
双黑节点:X
红色侄子:D
情况2
双黑节点兄弟结点是黑色,且有两个黑色子结点 解决方法:父祖换色、继续检查 把C着为红色,B着为黑色 B原为红色:黑-红-黑 -黑 -红 若B原为红色,则算法结束 B原为黑色:红-黑-黑 否则,对B继续作“双黑”调整 -黑 -红
O(logn)
O(1) O(logn)
红黑树插入算 法的时间复杂 度O(logn)
4、红黑树的删除
先调用BST的删除算法 如果被删除的结点有一个或两个外部叶结点, 则直接删除,算法结束 如果有两个非叶子结点,则在右子树中寻找最 小值结点(即其后续结点),与该结点进行值 交换(颜色不变) 然后调用删除结点算法,直到转换为有一个或 两个外部叶结点的情况,再进行删除
红黑树示例
树结点的结构
Key Data Color
由指针颜色可得到节点颜色
parent lchild rchild
红黑树结点定义示例
typedef int key_t; typedef int data_t; typedef enum color_t { RED = 0, BLACK = 1 }color_t;
typedef struct rb_node_t { key_t key; data_t data; color_t color; struct rb_node_t *parent; struct rb_node_t *left; struct rb_node_t *right, }rb_node_t;
新增节点X
针对XYb的调整:旋转
四种情况:LLb、RRb 、LRb、RLb
取双红节点、祖父节点这 三者的中位数作为新的子 根节点,并且着为黑色
原则:旋转中保持 BST的中序特性
针对XYr的调整:换色
四种情况:LLr、RRr 、LRr、RLr 以LLr为例:父祖换色
X:新增节点(红色) A:父节点(红色) B:祖父节点(黑色) C:叔父节点(红色)
其平均和最差检索时间复杂度O(log2n) 为了恢复红黑树的平衡,需要自底向根进行调整 红黑树的结点组成 数据、颜色、左指针、右指针、父指针 如不使用父指针,也可以使用堆栈, 保存从根结点到新插入或删除结点的路径上遇 到的每个结点,方便回溯
红黑树 VS. AVL树
AVL树要求完全平衡 红黑树只要求局部平衡:懒汉平衡 时间复杂度和AVL相同,但统计性能比AVL树 更高 任何不平衡都会在三次旋转之内解决 增、删算法性能好、易于实现 减少了开销、性能几乎没有下降
引入高度数索引树的原因
二叉搜索树比较适合于内存中组织较小的索引。对 于存放在外存中的较大的文件系统,用二叉搜索树 来组织索引就不太合适。若以结点作为内外存交换 的单位,则在查找过程中需对外存进行O(logn)次 访问,显然很费时。 解决方法:引入高度数搜索树
2、m叉搜索树
定义:m叉搜索树可以是一棵空树,如果非空,它必须满 足以下特征: 1)每个内部节点最多可以有m个子女及1~m-1个元素 (外部节点不含元素和子女) 2)每个含p个元素的节点,有p+1个子女 3)设k1…kp是p个元素的关键值,且k1<…<kp;c0…cp 是节点的p+1个孩子。则:
黑
红
BC父祖换色
情况3
双黑节点兄弟结点是红色 解决方法:单旋转转换为情况1或情况2
需要对X继续进行 双黑处理
结点删除示例
删除90
情况2: 兄弟结点是黑色, 且有两个黑子结点
当前结点变为80 的右黑结点,把 C着为红色,B着 为黑色
结点删除示例(1)
删除70
待删除结点是红 色结点,且有两 个外部结点
删除节点算法
待删除结点有两个外部结点, 直接把该结点变为叶结点 若该结点是红色,则算法结束 若该结点是黑色,删除后红黑树不平衡!“双黑” 待删除结点有一个外部结点 可知:如果该节点是黑色,其非空子节点为红色 双黑 将其子节点提升到该结点位置,颜色变黑
删除8
不平衡
双黑结点调整算法
索引顺序访问-ISAM(续1)
访问方法:对关键值为 k 的元素作一次随机访问, 首先只要寻找包含相应元素的块的索引,然后将 相应的块从磁盘中取出并在其中寻找需要的元素; 跨磁盘的字典存储模式:元素按升序被分配到各 个磁盘以及每个磁盘的不同块中;每个磁盘都有 一个块索引,其中保留了该磁盘每个块中的最大 关键值;另有一个磁盘索引,保存每个磁盘中的 最大关键值,这个索引一般驻留在内存中。
本节小结
红黑树的定义 红黑树的性质 红黑树的结点插入 换色 旋转或重构:双红调整 红黑树的结点删除 重着色 旋转或重构 双黑结点调整
章节
11.1 二叉搜索树 11.2 AVL树 11.3 红黑树 11.4 B-树 11.5 应用
内容提要
ISAM-索引顺序访问方法 m叉搜索树 定义 操作:搜索、插入、删除、高度 m序B-树 定义 操作:高度、搜索、插入、删除 B+树 与 B*树
索引表
21 0
40 5
78 10
……
索引顺序表 = 索引 + 顺序表
索引顺序查找:分块查找
查找过程:将表分成几块,块内无序,块间有序; 先确定待查记录所在块,再在块内查找 适用条件:分块有序表 算法实现: 用数组存放待查记录,每个数据元素至少含有关 键字域 建立索引表,每个索引表结点含有最大关键字域 和指向本块第一个结点的指针
3、红黑树的插入
先调用BST的插入算法 把新结点着色为红色 若父节点是黑色,则算法结束 否则,进行“双红调整” 【叔父节点】指一个节点的父节点的兄弟节点 插入4
双红调整的情况
叔父节点是黑色:XYb, 需要旋转或重构 每个结点的阶保持原值,调整完成 叔父节点是红色:XYr, 需要换色 换色后继续检查平衡!