1. B树基本概念
1.1 B树背景
B树是用于在外存工作的平衡搜索树。
当数据比较大,无法全部存入内存时,需要将部分数据存在外存中,在需要的时候读入内存,修改之后又写回外存。由于外存的速度与内存有几个数量级的差别,所以节省在外存上花的时间,对搜索树的性能提高时最有效的。
最常见的外存就是磁盘。磁盘是快设备,也就是说磁盘的读写单位是以块为单位,一般地块大小从0.5k到4k。即使你只读取一个字节,磁盘也是将包含该字节的所有数据读取到硬盘中。而在磁盘读取过程中,最占用时间的是磁盘的寻道,也就是磁头在盘片上找到需要读取的块所在位置的时间,而在盘片上顺序读取数据的所花的时间是占比比较小的。
要减少外存上花的时间,就可以从减少读盘次数以及减少寻道时间着手。
B树采取的方法就是,就充分的利用盘块的空间,在一个盘块中尽可能多的存储信息,或者在连续的盘块地址上存储尽可能多的信息。在数据结构上的变化就是每个节点存储多个key信息以及包含多个子节点。增加节点的分支树,就可以使得这棵树的高度降低,比如高度为2(roo高度为0)分支1000的数,就以存储1000*1000个关键字信息,而二叉树j的高度就至少需要6*ln10。
如下图,M,D,J等称为key,也就是存入B树种的数据项。
图1 -B树示例(来自《算法导论》)
1.2 B树定义
-
-
- x.n表示节点当前key的个数。
- x中key满足:x.key1 <= x.key2<= x.key3 <= .... <= x.keyx,n。也就是x中的key以非降序顺序排列。
- x要么是叶子节点,要么是内部节点。
-
-
-
- 除根节点外,每个节点必须有至少t-1个key,t个孩子。树不为空时,根节点至少有一个key。
- 每个节点至多有2*t-1个key,每个内部节点至多有2*t个孩子。当一个节点有2*t-1个key时,称其为满节点。
-
2. B树基本操作
2.1 查找
2.2 树的创建
2.3 插入key
-
- 若是根节点,则生成一个新的根节点,原根节点作为新根节点的第一个孩子,并对该孩子进行分裂操作。
- 若是内部节点,每次向适当孩子传递操作时,都需要检查该子树是否已满,若满则进行该子树,再将插入操作传递到适当的子树中。
- 若是叶子节点,则在适当的位置插入需要插入的key
- b) 插入B:孩子未满,直接插入
- c) 插入Q:孩子已满,分裂子树,key T上移到父节点中,然后在将Q插入到适当的孩子中
- d) 插入L:root已满,生成新root节点,分裂老root节点,在适当子树中插入适当孩子中
- e) 插入F:孩子已满,分裂子树,key C上移到父节点,在适当节点中插入Q
2.4 删除key
- 待删除key如果在当前节点中,转2,否则转8
- 当前节点是叶子,直接删除,完成删除操作。否则转3
- 待删除key分割的子树中,前一棵子树key的数量大于t-1,转4,否则转5.
- 从前一颗子树中删除该子树根节点中最大的key,将该key替换当前节点中待删除key,完成删除操作。
- 待删除key分割的子树中,后一棵子树的key数量打于t-1,转6,否则转7.
- 从后一颗子树中的根结点中删除该节点最小的key,用该key替换待删除key,完成删除。
- 合并该节点分割的两个子树,并从合并之后的子树中删除待删除key。
- 找到key可能存在的子树Tn,转9
- 该子树前一颗子树Tn-1的根节点key数量大于t-1,转10,否则转12
- 将Tn-1中最大的key替换当前节点中适当的key,并将被替换的key插入到Tn中,转11
- 将Tn-1中最后一个孩子,移动到Tn中适当的位置,将删除操作传递到Tn中。
- Tn的后一颗子树Tn+1的根节点key数量大于t-1,转13,否则转?
- 将Tn+1中最小的key替换当前节点,并将被替换的key插入到Tn+1中,转14
- 将Tn+1中最小的子树移动到Tn中,将删除操作传递Tn中。
3. 代码实现
3.1 AbstractBTreeNode
import java.util.LinkedList;
import java.util.Queue;
/**
* Created by Kali on 14-5-26.\
* Ab

本文介绍了B树的基本概念,包括其背景和定义,并详细阐述了B树的查找、创建、插入和删除操作。通过代码实现,展示了如何在Java中构建B树结构,包括AbstractBTreeNode、BTreeInternalNode、BTreeLeaf和BTree类的设计与应用。
最低0.47元/天 解锁文章
7668

被折叠的 条评论
为什么被折叠?



