`
gaofen100
  • 浏览: 1195733 次
文章分类
社区版块
存档分类
最新评论

2-3树实现分析

阅读更多

在2-3树中,每个内部节点(非叶子节点)有两个或三个孩子,而且所有叶子都在同一级别上。例如,图1显示高度为3的2-3树。包含两个孩子的节点称为2-节点,二叉树中的节点都是2-节点;包含三个孩子的节点称为3-节点。


图1:高度为3的2-3树
2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。若某棵2-3树不包含3-节点,则看上去像满二叉树,其所有内部节点都可有两个孩子,所有的叶子都在同一级别。另一方面,2-3树的一个内部节点确实有3个孩子,故比相同高度的满二叉树的节点更多。高为h的2-3树包含的节点数大于等于高度为h的满二叉树的节点数,即至少有2^h-1个节点。换一个角度分析,包含n的节点的2-3树的高度不大于[log2(n+1)](即包含n个节点的二叉树的最小高度)。
由此可知,2-3树可用于ADT列表的实现。若2-3树排序节点,使之成为一棵查找树,就可以用来实现ADT表。下面是2-3树的递归定义,它指定了节点的顺序。
如果满足下面的条件之一,T就是一棵2-3树:
(1)T为空,即高为0的2-3树。
或者
(2)T的形式:

其中r是包含一个数据项的节点,TL和TR各是高为h-1的2-3树。此时,r中的查找关键字必须大于子树TL中的查找关键字,并小于TR中的查找关键字。
或者
(3)T的形式为:

其中,r是包含两个数据项的节点,而TM、TL和TR各是高为h-1的2-3树。此时,r中的较小查找关键字必须大于左子树TL中的各个查找关键字,并小于种子数TM中的各个查找关键字。r中的较大查找关键字必须大于中子树TM中的各个查找关键字,并小于右子树TR中的各个查找关键字。
由此定义,可推出将数据项放入2-3树节点中的规则:
(1)2-节点有两个孩子,必含一个数据项,其查找关键字大于左孩子的查找关键字,而小于右孩子的查找关键字,如图2-a所示:
(2)3-节点有三个孩子 ,必含两个数据项,其查找关键字S和L满足下列关系:S大于左孩子的查找关键字,而小于中孩子的查找关键字;L大于中孩子的查找关键字,而小于右孩子的查找关键字。如图2-b所示:
(3)叶子可以包含一个或两个数据项。


(a)2-节点(b) 3-节点

图2 :2-3树的节点;


图3:一棵2-3树
这样,2-3树的项按查找关键字排序。例如,图3是一棵2-3树。
可用下面的c++语句表示2-3树的任何节点:

当节点只包含一个数据项时,可将其入smallItem,并用leftChildPtr和middleChildPtr来指向节点的孩子。为安全起见,可将NULL放入rightChildPtr。
下面分析2-3树的遍历、检索、插入和删除操作。这些操作都是使用递归算法。通过将这些递归算法的基例定义为叶子,而不是空子树,可以避免受到现实细节的干预。但这样,算法必须假设不能将空树作为参数传递给它们。
遍历2-3树
可通过类似于中序遍历的方式。
按有序的查找关键字顺序遍历2-3树

查找2-3树
2-3树中的节点排序与二叉树中的排序相似,允许在2-3树中有效地查找某一项。实际上,有下面的伪码可以看到,2-3树的检索操作非常类似与二叉树的检索操作。


插入算法
要将项I插入2-3树,首先定位查找I的操作将终止的叶子。将新项I插入叶子,若当前叶子包含两个项目,则任务完成。但若叶子包含三个项,则必须将其分为两个节点n1和n2。如图4所示。将最小项S放在n1,将最大项放在n2,将中间项M上移到叶子的双亲。结果,节点n1和n2成为双亲的孩子。若双亲只有三个孩子,并包含两个项目,则任务完成。但是,若双亲当前有四个孩子,并包含有三项,则需要拆分。


图4:在2-3树中拆分叶子
通过上述叶子操作的过程,拆分包含三个项的内部节点n,但必须考虑n的四个孩子。如图5所示,将n拆分为n1和n2,将n的最小项S放到n1,将n左面的两个孩子关联到n1。将n的最大项L放入n2,将n右边的两个孩子关联到n2,将n的中间项M上移到n的双亲。


图5 :拆分2-3的内部节点
此后,拆分节点和将项上移到双亲的过程递归地进行,知道遇到这样一个节点:再插入前,它只有一个项,而在接纳新项后,只有两个项。注意,在前面的插入序列中,树的高度保持不变,一直是原始3 。一般情况下,只要在从根到插入新项的叶子的路径上,至少有一个节点只包含一个项,则插入将不会增加树的高度。因此,与基本二叉查找树的策略相比,2-3树的插入策略推迟了树的高度的增长。
当2-3树的高度增长时,则从项的顶部向下完成。如果从根到插入新项的叶子的路径上,每个节点包含两个项,则2-3树的高度将增长。在这种情况下,拆分节点以及将项上移到节点双亲的递归过程最终到达根r。此时,向其他任何内部节点一样,必须为r拆分为r1和r2。不过,必须新建一个包含r的中间项的节点,是这个节点成为n1和n2的双亲的节点。于是,新节点成为树的新项,如图6所示。


图6: 拆分2-3树的根

下面的算法总结整个插入策略:

删除算法
总之,要从2-3树删除I项,首先定位包含它的节点n。如果n不是叶子,则查找I的中序后继,并交换I与中序后继。在交换后,删除总是从叶子开始。如果叶子包含除I之外的项。则只需删除I即可完成任务。但是,如果叶子只包含I,则删除I将导致I不包含数据项的叶子。此时,必须执行其他的一些操作,才能完成删除。
首先检查空叶子的兄弟。若其一个兄弟有两个项,则在兄弟,空叶子和叶子双亲之间重新分配数据项,如图7所示。若叶子的兄弟没有两个项,则将一个项从叶子的双亲下移到兄弟(之前,他有一个项,所以有放置另一个项的空间),并删除空叶子,以归并叶子与邻接兄弟,如果7-b所示。

如上所述,通过从节点n下移一个项,可能导致节点n不在包含数据项,而且只有一个孩子,若出现这种情况,则为n递归应用删除算法。如果n的一个兄弟包含两个项和三个孩子,则在节点n、兄弟和双亲之间重新分配项。另外,将兄弟的一个孩子给n,如图7-c所示。

若n的兄弟都没有两个项,则归并n与兄弟,如图7-d所示。换言之,从双亲下移一个项,并使兄弟接纳n的一个孩子(之前的兄弟只有一个项和两个孩子),然后删除空叶子。若归并导致n的双亲没有项,则为其递归地应用删除过程。

若继续归并,将导致根没有项并只有一个孩子,此时简单的删除根。执行这个步骤是,树的高度减1,如图7-e。


图7:(a)重新分配值;(b)归并叶子;(c)重新分配值和叶子;(d)归并内部节点;(e)删除根
下面是从2-3树删除项的算法的高级语句:


分享到:
评论

相关推荐

    B-Trees 的实现及分析

    首先说明M 路查找树,M 路查找树是二元查找树的一般化,其结构如下图所示的3 路查找树:M 路查找树中的任一结点至多存放M-1个数据,并至多拥有M棵子树;每个结点中的数据按升序排列V1 (k <= M-1),每个数据Vi 都存在...

    Python机器学习基础算法教程:课件+数据+代码

    Python机器学习基础算法教程:课件+数据+代码 一、课件PPT ...2-线性 回归代码实现 15-支持向量机原理推导 13-集成算法原理 1-线性回归原理推导 10-决策树原理 12-决策树实验分析 11-决策树代码实现

    编译原理课设:属性计算-递归下降语法分析器

    设计递归下降翻译器,完成语法分析和中间代码翻译。 输入:一个完整的源程序 输出:与输入对应的一个语法树、四元式序列 2、资源 课设报告word 课设源码 3、开发环境 编程语言:C++ IDE:VS 2019

    数据结构课程设计----哈夫曼树(c语言)

    通过该题目的设计过程,可以加深理解树及二叉树的逻辑结构、存储结构,掌握树及二叉树上基本运算的实现。进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力...

    数据结构实验报告-----trie树

    自学一种高级数据结构,并实现1)初始化2)插入元素3)删除元素4)查找元素5)相关应用 本程序实现了以上5个要求,实验报告是根据Trie树的学习与实现过程而写的。 内含源代码 适合人群:想要了解trie树的程序员 能学到...

    机器学习实战 - 决策树PDF知识点总结 + 代码实现

    决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画...

    实现语法分析器-编译原理

    4.修改Yacc程序,实现能构造语法树的分析器 考虑符号表处理的扩充 1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果 2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项...

    编译原理-语法分析实验(c++版)

    请根据给定的文法设计并实现语法分析程序,能基于上次作业的词法分析程序所识别出的单词,识别出各类语法成分。输入输出及处理要求如下: (1)需按文法规则,用递归子程序法对文法中定义的所有种语法成分进行分析;...

    Python机器学习 实验- 决策树1

    2.掌握如何实现决策树算法,并用其完成预测。 二、实验原理 决策树,信息熵,信息增益。 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目...

    数据结构与算法课程设计---AVL TREE的实现及分析

    (1)编写 AVL树判别程序,并判别一个二元查找树是否为 AVL树。二元查找树用其先序遍历结果表示,如:...(2)实现 AVL树的 ADT,包括其上的基本操作:结点的加入和删除;另外包括将一般二元查找树转变为 AVL树的操作。

    自底向上语法分析-算符优先分析器(C语言实现)

    2) 判断该文法是否为算符文法; 3) 对文法中的每个非终结符自动生成并打印输出: ① FIRSTVT集; ② LASTVT集; 4)判断该文法是否为算符优先文法, 如果是自动生成并打印输出其算符优先矩阵; 5) 模拟分析过程...

    数据结构与算法分析:C语言描述_原书第2版_高清版

    书中详细讨论了栈、队列、链表以及查找结构、高级树结构等功能,对裴波那契堆、伸展树、红黑树、2-3树、2-3-4树、二项堆、最小-最大堆、双端堆等新的数据结构进行了有效分析。《数据结构》(C语言版)对一些特殊形式的...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    堆6.6 左式堆6.6.1 左式堆的性质6.6.2 左式堆的操作6.7 斜堆6.8 二项队列6.8.1 二项队列结构6.8.2 二项队列操作6.8.3 二项队列的实现总结练习参考文献第7章 排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的...

    精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功!

    \数据结构flash演示\版本1\6-7-3树的先根遍历过程.swf \数据结构flash演示\版本1\6-7-4树的后根遍历过程.swf \数据结构flash演示\版本1\6-7-5先序遍历森林.swf \数据结构flash演示\版本1\6-7-6中序遍历森林.swf ...

    编译原理实验二:Tiny扩充语言语法分析

    实验二:TINY扩充语言的语法分析 扩充的语法规则有:实现 while、do while、for语句和求余计算式子,具体文法规则自行... (2)可由用户选择是否生成语法树,并可查看所生成的语法树。 (3)应该书写完善的软件文档

    用java实现的大数据分析 ID3算法

    分析如以上数据可得出如下决策树(横着看) |--outlook --|--rainy --|--windy --|--TRUE --|--NO -- |--FALSE --|--YES -- |--sunny --|--humidity --|--high --|--NO -- |--normal --|--YES -- ...

    基于java的词法分析器-支持LL(1)语法分析、LR(1)语法分析.zip

    2. **LL(1)语法分析**: - 使用LL(1)分析法,构建一个预测分析表。 - 实现一个递归下降分析器或LL(1)分析器,根据预测分析表解析词法单元流。 - 构建抽象语法树(AST)。 3. **LR(1)语法分析**: - 使用LR(1)...

    数据结构课程设计-图书管理系统-语音TTS-源代码

    一. 需求分析 完成简单的图书管理业务 1)新书入库:登记新书的编号.书名.作者和数量 2)书目信息维护 : 删除,更新 3)读者信息维护:新增,删除读者 4)查询 5)借阅,归还 语音提示功能 1) 用户进行操作时语音提示....

    基于mediastreamer2的网络电话实现流程以及源码库

    然后解压 tar zxvf libosip2-3.6.0.tar.gz 注意这个时候可能会发生错误,是没有权限的问题,那么就在命令行前边加上sudo 然后配置 把下边这三行写成一个脚本 vim **.sh ./configure --host=arm-linux --target=arm-...

    哈夫曼编码译码--数据结构

    2. 分析与概要设计:根据搜集的资料,进行程序功能与数据结构分析,并选择合适的数据结构、并在此基础上进行实现程序功能的算法设计。 3. 程序设计:运用掌握C/C++语言编写程序,实现各个模块功能。 4. 调试与测试:...

Global site tag (gtag.js) - Google Analytics