算法之2-3-4树

2-3-4树是一种阶为4的B树。它是一种自平衡的数据结构,可以在O(lgn)的时间内查找、插入和删除,这里的n是树中元素的数目。2-3-4树和红黑树是等价的,也就是每个红黑树都可以转化为一颗2-3-4树,每个选择操作也和2-3-4树中的分裂操作对应。

2-3-4树是这样一种数据结构,满足如下性质:

1) 每个节点每个节点有1、2或3个key,分别称为2-node,3-node,4-node。

2) 每个节点的keys把区间进行了划分,以4-nde为例,key1、key2、key3分别夹在subtree1, subtree2和subtree2, subtree3和subtree3, subtree4之间。

3) 4-node的子节点不能是4-node。

如下图所示:

      搜索:

1. 从root开始

2. 比较当前节点的值

2.1 如果找到,就返回当前节点

2.2 如果没有找到,就找出要搜索的值属于哪一个子树

3. 递归的搜索子树

      在插入和删除的关键是维持性质3),即4-node的节点不能是4-node

     插入Key

     1.递归搜索Key

1.1 如果root是4-node(ABC),则建一个新的root(B),A,C成为它的两个子树

     1.2 向下搜索, 对于中途经过的每一个node, 如果它是4-node则使用如下图的变换分拆(注意到根据假设算法不会产生4-node的子节点是4-node, 所以这个操作总是能进行的)

     1.3 如果相应的key已存在, 则算法结束, 不需要插入

2. 注意到如果key不存在, 则1的递归搜索一定停在叶节点

3. 在当前的叶节点插入

     3.1 如果是2-node或3-node, 则插入当前节点把它变成3-node或4-node, 算法结束

     3.2 如果是4-node, 则根据假设, 它的父节点一定不是4-node(即是2-node或者3-node)

       3.2.1 使用与1.2相同的变换分拆4-node

       3.2.2 插入相应节点(如图所示, 一定是2-node)

要证明2-3-4上面的出入算法一定形成一个平衡树,即从root开始往下到任一个叶子的长度都是相等。

用数学归纳法:

1. 只有一个节点的树当然是平衡的

2. 假设插入了n个元素,树还是平衡的,现在插入一个新元素,要证明不会破坏平衡性:

算法会改变tree的是1.1, 1.2, 3.1, 3.2。显然1.2, 3.1, 3.2都不会改变树的深度,考虑1.1,它令树的路径深度增加1,原来的树是平衡的,深度增加后当然还是平衡的。

有n个元素的2-3-4树的深度的粗略估计;最坏情况全是2-node,则深度是logn,最好情况全是4-node,深度为logn/2,故:

logn/2 <  depth  ≤  logn(左边括号是不可能的,因为不存在4-node的子节点是4-node)。

想详细了解代码实现,请移步http://www.cnblogs.com/guoyiqi/archive/2011/06/08/2129310.html。我这里只提一些概念性的东西

时间: 2025-01-04 21:16:23

算法之2-3-4树的相关文章

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

平衡查找树的目标是实现查找.插入.删除操作在最坏情况下的复杂度均为logN. 本节将介绍二三查找树. 二三树中有两种节点: 二节点对应一个键,有两个子节点 三节点对应两个键,有三个子节点 二三查找树非常平衡,每个空节点到根节点的距离都是一样的 . 查找操作 在二三树中查找一个键的时候有以下规则: 如果是二节点,二节点对应1个值,如果要查找的值比该节点对应的值小,就往左侧深入,反之亦成 如果是三节点,三节点对应2个值,如果比两个值都小,就往左侧深入,如果介于两个值之间,就往中间深入,如果比两个值都

数据挖掘十大经典算法--CART: 分类与回归树

一.决策树的类型  在数据挖掘中,决策树主要有两种类型: 分类树 的输出是样本的类标. 回归树 的输出是一个实数 (比如房子的价格,病人呆在医院的时间等). 术语分类和回归树 (CART) 包括了上述两种决策树, 最先由Breiman 等提出.分类树和回归树有些共同点和不同点-比如处理在何处分裂的问题. 分类回归树(CART,Classification And Regression Tree)也属于一种决策树,之前我们介绍了基于ID3和C4.5算法的决策树. 这里仅仅介绍CART是如何用于分类

算法导论:Trie字典树

1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/tra?/ “try”. Trie树可以利用字符串的公共前缀来节约存储空间.如下图所示,该trie树用10个节点保存了6个字符串pool.prize.preview.prepare.produce.progress 在该trie树中,字符串preview,prepa

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

算法第十八章 B树

一.高级数据结构 本章以后到第21章(并查集)隶属于高级数据结构的内容.前面还留了两章:贪心算法和摊还分析,打算后面再来补充.之前的章节讨论的支持动态数据集上的操作,如查找.插入.删除等都是基于简单的线性表.链表和树等结构,本章以后的部分在原来更高的层次上来讨论这些操作,更高的层次意味着更复杂的结构,但更低的时间复杂度(包括摊还时间). B树是为磁盘存储还专门设计的平衡查找树.因为磁盘操作的速度要远远慢于内存,所以度量B树的性能,不仅要考虑动态集合操作消耗了多少计算时间,还要考虑这些操作执行了多

算法学习笔记 平衡二叉树 AVL树

AVL树是最先发明的自平衡二叉查找树, 其增删查时间复杂度都是 O(logn), 是一种相当高效的数据结构.当面对需要频繁查找又经常增删这种情景时,AVL树就非常的适用.[ 博客地址:http://blog.csdn.net/thisinnocence ] AVL树定义 AVL树诞生于 1962 年,由 G.M. Adelson-Velsky 和 E.M. Landis 发明.AVL树首先是一种二叉查找树.二叉查找树是这么定义的,为空或具有以下性质: 若它的左子树不空,则左子树上所有的点的值均小

算法篇——果园里的树

来源:<算法竞赛入门经典>例题5.4.3 题目:果园里的树排列成矩阵.它们的x和y坐标均是1~99的整数.输入若干个三角形,依次统计每一个三角形内部和边界上共有多少棵树 样例输入: 1.5 1.5  1.5 6.8 6.8 1.5 10.7 6.9 8.5 1.5 14.5 1.5 样例输出: 15 17 分析: 三角形的有向面积: double area2(double x0,double y0,double x1,double y1,double x2,double y2) { retur

【算法学习笔记】40.树状数组 动态规划 SJTU OJ 1289 扑克牌分组

Description cxt的扑克牌越来越先进了,这回牌面的点数还可以是负数, 这回cxt准备给扑克牌分组,他打算将所有的牌分成若干个堆,每堆的牌面总和和都要大于零.由于扑克牌是按顺序排列的,所以一堆牌在原牌堆里面必须是连续的.请帮助cxt计算一下,存在多少种不同的分牌的方案.由于答案可能很大,只要输出答案除以1,000,000,009的余数即可. Input Format 第一行:单个整数:N,1 ≤ N ≤ 10^6 第二行到N + 1行:在第i + 1行有一个整数:Ai, 表示第i张牌牌

算法xio讲堂#2--线段树

浅谈线段树 (来自TRTTG大佬的供图) 线段树个人理解和运用时,认为这个是一个比较实用的优化算法. 这个东西和区间树有点相似,是一棵二叉搜索树,也就是查找节点和节点所带值的一种算法. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN),这个时间复杂度非常的理想,但是空间复杂度在应用时是开4N的. 所以这个算法有优势,也有劣势. 我们提出一个问题 如果当前有一个区间,需要你在给定区间内做以下操作: l,z 在l上加上z l 查询l的值 l,r,z 在[l,r]

常用算法之Trie【字典树,前缀树】

Trie中文名又叫做字典树,前缀树等,因为其结构独有的特点,经常被用来统计,排序,和保存大量的字符串,经常见于搜索提示,输入法文字关联等,当输入一个值,可以自动搜索出可能的选择.当没有完全匹配的结果时,可以返回前缀最为相似的可能. 其实腾讯的面试题有一个:如何匹配出拼写单词的正确拼写.其实用匹配树非常合适. 基本性质: 1.根节点不含有字符,其余各节点有且只有一个字符. 2.根节点到某一节点中经过的节点存储的值连接起来就是对应的字符串. 3.每一个节点所有的子节点的值都不应该相同. 借用一下维基