多路查找树

      在前面专题中讲的BST、AVL、RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关,都是在内存中进行的。那么降低树高自然对查找效率是有所帮助的。

    另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实际背景下,平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。那么如何减少树的深度(当然不能减少查询数据量),一个基本的想法就是:

1. 每个节点存储多个元素(但元素数量不能无限多,否则查找就退化成了节点内部的线性查找了)。

2. 摒弃二叉树结构,采用多叉树(由于节点内元素数量不能无限多,自然子树的数量也就不会无限多了)。


  多路查找树(muitl-way search tree) 每个节点的孩子可以树可以多余两个; 每个节点可以存储多个元素;

           1、2-3树
                每个节点都具有2个孩子(称之为2节点)或者3个孩子(称之为3节点)。
          一个2节点包含一个元素和两个孩子(或没有孩子)。

                                  一个3节点包含两个元素和三个孩子(或没有孩子)。

      1.1. 2-3树的插入实现

     1.对于空树 插入一个节点直接插入就好。

     2.插入节点到一个2节点的叶子上。  比如插入3

      

           3.将一个节点插入到原来上3节点的叶子上

      3.1要在3节点上插入,此时3节点的上面是2节点 则将 上面的2节点变成3节点  比如插入5

       

        3.2 要在3节点上插入,此时3节点上面是3 节点 则将上面首次出现为2节点的节点变成3节点。比如插入11

            

       以前我们普通叉树 插入时都是在叶子节点后添加,这样会导致二叉树的高度不断增加。查找困难。

         此时 我们用2-3树时重复分利用特性。 往上寻找有用空间 进行有效的利用

          3.3 要在3节点插入数据时  ,该3节点往上遍历都是3节点,这时要扩展高度了。



   1.2     2-3树的删除实现。

             1.要删除的数位于3节点地址上。 3节点 ->2节点就好  比如删除6

          

           

             2.要删除的数位于2叶子节点上。

                   1.此叶子节点上一级是2节点,但是他有一个3节点的有孩子。

               

                   2.叶子节点上一级是2节点,但是他有一个2节点的有孩子。

               

                    3.此叶子节点双亲是一个3节点。

             

                    4.删除的是一个满二叉树叶子节点

               

                 5.  要删除的元素位于非叶子节点的分支上。

                     当是2节点时 则按照中序遍历 找此节点前面或者后面的数顶底下。

                      

                     当是3 节点的时候  将3节点的左孩子提升上去 

                       

           2-3-4理论上跟2-3树是一样的 。  



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoWhat1412

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值