经典数据结构与算法(二):平衡查找树之2-3树

转载 2016年06月01日 14:43:51

平衡查找树之2-3树

前面介绍了二叉查找树(Binary Search Tree),他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找树(Balanced Search Tree)。在一棵具有N 个节点的树中,我们希望该树的高度能够维持在lgN左右,这样我们就能保证只需要lgN次比较操作就可以查找到想要的值。不幸的是,每次插入元素之后维持树的平衡状态太昂贵。所以这里会介绍一些新的数据结构来保证在最坏的情况下插入和查找效率都能保证在对数的时间复杂度内完成。本文首先介绍2-3查找树(2-3 Search Tree),后面会在此基础上介绍红黑树和B树。

定义

和二叉树不一样,2-3树运行每个节点保存1个或者两个的值。对于普通的2节点(2-node),他保存1个key和左右两个自己点。对应3节点(3-node),保存两个Key,2-3查找树的定义如下:

1. 要么为空,要么:

2. 对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key有效,有节点也是一个2-3节点,所有的值比key要大。

3. 对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点。左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大。

如果中序遍历2-3查找树,就可以得到排好序的序列。在一个完全平衡的2-3查找树中,根节点到每一个为空节点的距离都相同。

Definition of 2-3 tree

查找

在进行2-3树的平衡之前,我们先假设已经处于平衡状态,我们先看基本的查找操作。

2-3树的查找和二叉查找树类似,要确定一个树是否属于2-3树,我们首先和其跟节点进行比较,如果相等,则查找成功;否则根据比较的条件,在其左中右子树中递归查找,如果找到的节点为空,则未找到,否则返回。查找过程如下图:

search in 2-3 tree

插入

往一个2-node节点插入

往2-3树中插入元素和往二叉查找树中插入元素一样,首先要进行查找,然后将节点挂到未找到的节点上。2-3树之所以能够保证在最差的情况下的效率的原因在于其插入之后仍然能够保持平衡状态。如果查找后未找到的节点是一个2-node节点,那么很容易,我们只需要将新的元素放到这个2-node节点里面使其变成一个3-node节点即可。但是如果查找的节点结束于一个3-node节点,那么可能有点麻烦。

insert new node into 2-node

往一个3-node节点插入

往一个3-node节点插入一个新的节点可能会遇到很多种不同的情况,下面首先从一个最简单的只包含一个3-node节点的树开始讨论。

只包含一个3-node节点

Insert into a single 3-node

 

 

如上图,假设2-3树只包含一个3-node节点,这个节点有两个key,没有空间来插入第三个key了,最自然的方式是我们假设这个节点能存放三个元素,暂时使其变成一个4-node节点,同时他包含四个子节点。然后,我们将这个4-node节点的中间元素提升,左边的节点作为其左节点,右边的元素作为其右节点。插入完成,变为平衡2-3查找树,树的高度从0变为1。

节点是3-node,父节点是2-node

和第一种情况一样,我们也可以将新的元素插入到3-node节点中,使其成为一个临时的4-node节点,然后,将该节点中的中间元素提升到父节点即2-node节点中,使其父节点成为一个3-node节点,然后将左右节点分别挂在这个3-node节点的恰当位置。操作如下图:

Insert into a 3-node whose parent is a 2-node

节点是3-node,父节点也是3-node

当我们插入的节点是3-node的时候,我们将该节点拆分,中间元素提升至父节点,但是此时父节点是一个3-node节点,插入之后,父节点变成了4-node节点,然后继续将中间元素提升至其父节点,直至遇到一个父节点是2-node节点,然后将其变为3-node,不需要继续进行拆分。

Insert into a 3-node whose parent is a 3-node

 

 

 

根节点分裂

当根节点到字节点都是3-node节点的时候,这是如果我们要在字节点插入新的元素的时候,会一直查分到跟节点,在最后一步的时候,跟节点变成了一个4-node节点,这个时候,就需要将跟节点查分为两个2-node节点,树的高度加1,这个操作过程如下:

Insert into a 3-node whose parent is a 3-node

本地转换

将一个4-node拆分为2-3node涉及到6种可能的操作。这4-node可能在跟节点,也可能是2-node的左子节点或者右子节点。或者是一个3-node的左,中,右子节点。所有的这些改变都是本地的,不需要检查或者修改其他部分的节点。所以只需要常数次操作即可完成2-3树的平衡。

 

splite a 4-node is a local transformation

性质

这些本地操作保持了2-3树的平衡。对于4-node节点变形为2-3节点,变形前后树的高度没有发生变化。只有当跟节点是4-node节点,变形后树的高度才加一。如下图所示:

global property of 2-3 tree

 

分析

完全平衡的2-3查找树如下图,每个根节点到叶子节点的距离是相同的:

perfect balanced 2-3 tree

2-3树的查找效率与树的高度是息息相关的。

  • 在最坏的情况下,也就是所有的节点都是2-node节点,查找效率为lgN
  • 在最好的情况下,所有的节点都是3-node节点,查找效率为log3N约等于0.631lgN

距离来说,对于1百万个节点的2-3树,树的高度为12-20之间,对于10亿个节点的2-3树,树的高度为18-30之间。

对于插入来说,只需要常数次操作即可完成,因为他只需要修改与该节点关联的节点即可,不需要检查其他节点,所以效率和查找类似。下面是2-3查找树的效率:

analysis of 2-3 tree

实现

直接实现2-3树比较复杂,因为:

  1. 需要处理不同的节点类型,非常繁琐
  2. 需要多次比较操作来将节点下移
  3. 需要上移来拆分4-node节点
  4. 拆分4-node节点的情况有很多种

2-3查找树实现起来比较复杂,在某些情况插入后的平衡操作可能会使得效率降低。在2-3查找树基础上改进的红黑树不仅具有较高的效率,并且实现起来较2-3查找树简单。

但是2-3查找树作为一种比较重要的概念和思路对于后文要讲到的红黑树和B树非常重要。希望本文对您了解2-3查找树有所帮助。


转自:http://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html

平衡查找树——2-3查找树——红黑树(1)

二叉查找树VS平衡查找树Binary Search Tree possibilitiesBalanced Search Trees如何学 平衡查找树为了保证之前学习的二分查找树BST的平衡性,解决在最...
  • baibaibai66
  • baibaibai66
  • 2016年09月30日 14:41
  • 1142

十二、平衡二叉树(2-3查找树、红黑二叉树)

平衡二叉树 2-3查找树保证平衡 红黑二叉树 旋转 向2结点中插入新键 向树底部的2-结点插入新键 向3结点插入新键 向树底部的3-结点插入新键 红链接的传递 删除最小键 构造轨迹 性质平衡二叉树理想...
  • guanhang89
  • guanhang89
  • 2016年04月01日 21:41
  • 1917

算法原理系列:2-3查找树

2-3查找树第一次接触它是在刷数据结构那本书时,有它的介绍。而那时候只是单纯的理解它的节点是如何分裂,以及整个构建过程,并不清楚它的实际用处,所以看了也就忘了。而当看完《算法》查找章节时,顿时有种顿悟...
  • u014688145
  • u014688145
  • 2017年03月28日 18:31
  • 1179

【数据结构和算法06】2-3-4树

从第4节的分析中可以看出,二叉搜索树是个很好的数据结构,可以快速地找到一个给定关键字的数据项,并且可以快速地插入和删除数据项。但是二叉搜索树有个很麻烦的问题,如果树中插入的是随机数据,则执行效果很好,...
  • eson_15
  • eson_15
  • 2016年04月13日 08:57
  • 5135

多路查找树开篇

转载地址:http://blog.csdn.net/dazhong159/article/details/7964245 1、引言         以前我们所讨论的数据结构,处理数据都是在内存中...
  • zzuchengming
  • zzuchengming
  • 2015年11月19日 15:19
  • 607

算法5-1:平衡查找树之二三树

平衡查找树的目标是实现查找、插入、删除操作在最坏情况下的复杂度均为logN。 本节将介绍二三查找树。 二三树中有两种节点: 二节点对应一个键,有两个子...
  • caipeichao2
  • caipeichao2
  • 2014年06月11日 19:02
  • 1622

2-3查找树的插入与删除

本片博客前面部分截取自算法(第4版) 定义:   查找: 要判断一个键是否存在树中,先将它和根节点中的键比较,如果它和其中任意一个相等,查找命中;否则就根据比较的结果找到指向相应区...
  • Hello_World_LVLcoder
  • Hello_World_LVLcoder
  • 2017年05月21日 22:14
  • 631

查找三 多路查找树(2-3树,2-3-4树,B树、B+树)

应用场景:解决在硬盘中的大量数据中的查找。因为大量数据存储在硬盘中,不能一次全部加载到内存中,而每次查一个数据读一次硬盘,读取速度太慢,这时就需要使用一种数据结构一部分一部分读入,这就是多路查找树的作...
  • u010512964
  • u010512964
  • 2017年07月26日 00:01
  • 357

数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

BST树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);        2.所有结点存储一个关键字;        3...
  • Sup_Heaven
  • Sup_Heaven
  • 2014年09月16日 12:07
  • 32364

数据结构之二叉查找树

二叉查找树是按二叉树的结构来组织的,如下图所示。每个结点都是一个对象;结点中除了数据key外,还有三个指针p,left,right,分别指向父结点,左儿子,右儿子。 二叉查找树总是满足一下性...
  • KangRoger
  • KangRoger
  • 2013年04月15日 20:52
  • 1839
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经典数据结构与算法(二):平衡查找树之2-3树
举报原因:
原因补充:

(最多只允许输入30个字)