B树与B+树
来源:互联网 发布:sql查询不重复的记录 编辑:程序博客网 时间:2024/05/22 10:48
(一)B树
1.1 定义
B树又称为平衡多路查找树,相比于AVL树(平衡二叉树),B树的最大的特点就是节点内部有多个关键字以及有多个子节点。典型的B树如下图所示:
B树的阶数描述了每一个节点子节点的个数(上图为3阶B树)。图中“磁盘块I”是根节点,内部存储17和35两个关键字,有三个子节点。需要注意的是,最下方的“磁盘块5~11”叶子节点,他们的子节点,也就是空节点,代表着一次失败的搜索。
一个m阶B树需要满足下列条件:
- 所有节点至少有2个子节点;除根结点和叶子节点之外,所有节点最多有m个子节点
- 除根节点之外的所有节点至少有ceil(m/2)个子女
- 所有子节点位于同一层(同一高度,根节点高度为1)
- 非叶子节点若有n个子节点,那么他的关键字必须有n-1个,且按照升序排列
- 非叶子节点X的第i个子节点Y的关键字
ki ,需要满足Ki−1<ki<Ki 。其中Ki 是X节点的第i个关键字,若i−1≤0 则Ki−1=−inf 。
1.2 搜索与复杂度
如上图所示,寻找关键字36的过程为:
·【磁盘块1】:36>35 -> P3->【磁盘块4】:36<65 -> P1->【磁盘块9】:36=36 -> 成功
B树的搜索复杂度直接取决于其高度和阶数。搜索成功所需要的时间取决于关键字所在的层次,不成功的时间取决于树的高度。
【重要】如果给定总关键字个数N,那么B树的高度h应满足:
1.3 插入与删除
-> 节点p中小于m-1个关键码 - 直接插入 -> 节点p中已经有m-1个关键码,当再插入一个关键码后节点的状态为: (m,P0,K1,P1,...Km,Pm) - 把节点分裂为两个节点p_和q,它们包含的信息分别为: { s = ceil(m/2)-1 } p_ : (s,P0,K1,P1,...,Ks,Ps) q : (m-s,Ks,Ps,...Km,Pm) - 新p_节点代替原来的p节点;位于中间的关键码Ks与指向新节点q的指针&q形成一个二元组(Ks,&q),插入到这两节点的父节点中去。
-> 非叶子节点:删除关键码Ki,用Pi指向的节点中最小的关键码代替之 -> 叶子节点: - 分为四种情况。详见[B树删除操作](http://blog.csdn.net/qifengzou/article/details/21473739)
(二)B+树
与B树的不同
- 所有关键码都存放在叶节点中,上层非叶节点的关键码是其子树中最小/最大关键码的复写。
- 也节点包含了全部关键码和指向相应数据记录存放地址的指针,叶节点按照关键码从大到小顺序连接。
阅读全文
0 0
- B+与B-树
- b树与b+和b-树
- B树与B+树
- B-树 与 B+树
- B树与B+树
- B树与B+树
- B-树与B+树
- B树与B+树
- B树与B+树
- B树与B+树
- B 树与B+树
- B树与B+树
- B,B-,B+,B*树
- B-、B、B+、B*树
- B/B+/B*树
- B- ,B+ , B*树
- B , B+ ,B*树
- B-, B+,B* 树
- Unsupervised Image-to-Image Translation Networks---VAE+GAN+Cycle
- CSAPP Note chap1
- 第一个自动化测试脚本
- 单点登录
- Python之模块应用
- B树与B+树
- Linux系统查看服务器型号、CPU、RAM、ROM以及网卡信息
- waitpid WNOHANG
- C语言 指针方法实现三个数排序
- Rhyme/Spring Bean概述 1.3. Bean overview
- java安全组成、包及第三方扩展
- Pizza Separation CodeForces
- springMVC+commons文件的上传与下载
- python abc模块