【说明】博客内容选自课件内容和邓俊辉老师《数据结构下》课件内容
目录
1.B-树的定义
B-树是一种满足以下特性的m叉动态搜索树:
1)根结点至少有两个子树;
2)除根结点外,所有内部结点至少有⌈m/2⌉ 个子树,最多有 m 棵子树;
3)所有外部结点位于同一层上;
(1). 多叉特性
在 m 阶的B-树上,每个内部结点可能含有:
n 个关键字 Ki(1≤ i≤n) ⌈m/2⌉ -1≤n≤m-1
n+1 个指向子树的指针 Ai(0≤i≤n);
(2). 查找特性
l内部结点中的多个关键字均从小到大有序排列,即:K1< K2 < … < Kn;
l Ai-1 所指子树上所有关键字均小于Ki;
l Ai 所指子树上所有关键字均大于Ki;
(3). 平衡特性
l树中所有叶子(外部)结点均在树的同一层次上;
l根结点或为叶子结点,或至少含有两棵子树;
l其余所有非叶结点均至少含有⌈m/2⌉棵子树,至少⌈m/2⌉-1个关键字,至多含有 m 棵子树;
2.查找算法:
从根结点出发,沿指针搜索内部结点和在结点内进行顺序(或折半)查找 两个过程交叉进行。
l若查找成功,则返回指向被查关键字所在结点的指针和关键字在结点中的位置
l 若查找不成功,则返回插入位置。
3.插入操作
在查找不成功之后,需进行插入。显然,关键字插入的位置 p 必定在最下层的非叶结点,有下列几种情况:
1)若 p 为空,则建新的根结点。
2)插入后,该结点的关键字个数n<m,不修改指针;
3)插入后,该结点的关键字个数 n=m,则需进行“结点分裂”。
令 s = ⌈m/2⌉,假设插入后的原结点中:(A0, K1, …, Ks-1,As-1 , Ks, As, Ks+1,… Km, Am )
则在原结点中保留:(A0,K1,。。。, Ks-1,As-1);
并建新结点(As,Ks+1,。。。 ,Km,Am);
然后将 Ks 插入p的双亲结点;
4.删除操作
与插入相反,首先必须找到待删除关键字所在结点,并删除之。删除分两种情况:
1.所删的结点是最下层的内部结点
此时又有三种可能:
1)被删关键字所在结点的关键字数目大于⌈m/2⌉-1,则只需删除该关键字和相应指针;
2) 被删关键字所在结点关键字数目等于⌈m/2⌉-1,且该结点相邻的左(右)兄弟结点中的关键字大于⌈m/2⌉-1,则将其兄弟结点中的最小(最大)的关键字上移至双亲结点中,将双亲结点中小于(大于)且紧靠该上移关键字的关键字下移至被删关键字所在结点中。
3) 被删关键字所在结点和其相邻的左(右)兄弟结点中的关键字数目均等于⌈m/2⌉-1。则在删除关键字之后,将它所在结点中剩余的关键字,加上双亲结点中的相应关键字,合并到左(右)兄弟结点中。如果因此使双亲结点中的关键字数目小于⌈m/2⌉-1 ,则依次作相应处理。
2. 所删结点不是最下层的内部结点
设所删关键字为Ki,则以指针Ai所指子树中的最小关键字Y替代Ki ,然后删除相应结点中的Y ;
5.查找性能的分析
问题:含 N 个关键字的 m 阶 B-树可能达到的最大深度 H 为多少?
反问: 深度为H的m阶 B-树中,至少含有多少个结点?
先推导每一层所含最少结点数:
问题:如果B- 树中含有 N 个关键字,则叶子结点的个数为?N+1
假设 m 阶 B-树的深度为 H+1,由于第 H+1 层为叶子结点,所以深度为 H+1的m阶B-树的叶子结点至少为2*⌈m/2⌉ ^H-1
因此: N+1≥2(⌈m/2⌉)H-1
H-1≤log⌈m/2⌉((N+1)/2)
H≤log⌈m/2⌉ ((N+1)/2)+1
结论:在含 N 个关键字的m阶B-树上进行一次查找,需访问的结点个数不超过log ⌈m/2⌉ ((N+1)/2)+1
疑惑:B-树中的关键字到底指的是什么?为什么叶子节点的个数比关键字的个数多一?
关键字指的是B-树所有节点中存储的值,
一棵B-树包含根节点、内部节点和叶子节点(也就是外部节点)
个数之所以多一应该是类似完全二叉树吧,就是最底层的节点比除底层外所有节点个数多一。
但是不应该啊,因为B-树的每个节点的分支是在一个区间之内的,就是⌈m/2⌉ 和m之间
难道是和建立B-树的过程有关吗???