多叉树
二叉树的缺陷:
1、在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),海量节点对构建二叉树的速度有影响
2、海量节点也会造成二叉树的高度很大,会降低操作速度
多叉树
1、允许每个节点可以有更多的数据项和更多的子节点
2、多叉树通过重新组织节点,减少树的高度,减少i/o读写次数来提升效率
3、如2-3树、2-3-4树、B树、B+树、B*树
B 树
1、文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(页的大小通常为4k),这样每个节点只需要一次i/o就可以完全载入
2、所有叶子节点都在同一层
3、B树的阶:节点的最多子节点个数,比如 2-3 树的阶是3,2-3-4 树的阶是4
4、B树的搜索,从根节点开始,对节点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的子节点;重复,直到所对应的儿子指针为空,或已经是叶子节点
5、关键字集合分布在整颗树中, 即叶子节点和非叶子节点都存放数据
6、搜索有可能在非叶子节点结束,其搜索性能等价于在关键字全集内做一次二分查找
7、假设有 M 阶的 B 树
(1)定义任意非叶子节点最多只有 M 个儿子,且 M > 2
(2)根节点的子节点数为 [2, M],关键字数为 [1, M - 1]
(3)除根节点以外,非叶子节点的子节点数为最少为 ⌈M / 2⌉,最多为 M,关键字存放至少 ⌈M / 2⌉ - 1,存放至多 M - 1 个关键字
(4)非叶子节点的关键字个数 = 该节点的指针个数 - 1
(5)非叶子节点的关键字:K[1],K[2],……,K[M-1];且 K[i] < K[i + 1]
(6)非叶子节点的指针:P[1],P[2],……,P[M],其中 P[1] 指向关键字小于 K[1] 的子树,P[M] 指向关键字大于 K[M-1] 的子树,其它 P[i] 指向关键字属于 (K[i-1], K[i]) 的子树
(7)所有叶子节点位于同一层,叶子结点不包含任何关键字信息,可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为 null,引入叶子结点的目的是为了方便分析 B 树的查找性能
8、若 m 阶 B 树某一非叶子节点包含 N 个关键字,则此非叶子节点含有 N + 1 个子节点,而所有的叶子结点都在第 i 层,可以得出
(1)因为根至少有 2 个孩子,因此第 2 层至少有 2 个结点
(2)除根和叶子外,其它结点至少有 ⌈m / 2⌉ 个子节点(向上取整)
(3)因此在第 3 层至少有 2 * ⌈m / 2⌉ 个结点,在第 4 层至少有 2 * ⌈m / 2⌉2 个结点,在第 L 层至少有 2 * ⌈m / 2⌉L - 2 个结点,于是有 N+1 >= 2 * ⌈m / 2⌉L - 2
(4)考虑第 L 层的结点个数为 N + 1,那么 2 * ⌈m / 2⌉L - 2 <= N + 1,也就是 L 层的最少结点数刚好达到 N + 1 个,即:L <= log⌈m / 2⌉((N + 1) / 2) + 2
(5)所以一棵含有 N 个总关键字数的 m 阶 B 树的最大高度为 L - 1(因为在计算 B 树高度时,叶结点所在层不计算在内),即:L - 1 = log⌈m / 2⌉((N + 1) / 2) + 1
(6)B 树的高度公式从侧面显示了 B 树的查找效率是相当高的
B+ 树
1、B+ 树是 B 树的变体,也是一种多路搜索树,B 树和 B+ 树各有自己的应用场景,B+ 树更适合文件索引系统
2、B+ 树的搜索与 B 树也基本相同,区别是 B+ 树只有达到叶子节点才命中,不可能在非叶子节点命中(B 树可以在非叶子节点命中),其性能也等价于在关键字全集做一次二分查找
3、为所有叶子节点增加一个链指针
4、稠密索引:所有关键字都出现在叶子节点的链表中(即数据只能在叶子节点),且链表中的关键字(数据) 是有序的
5、稀疏索引:非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储关键字的数据层
B* 树
1、B* 树是 B+ 树的变体,在 B+ 树的非根和非叶子节点再增加指向兄弟的指针
2、B*树定义了非叶子节点关键字个数至少为(2/3)*树的度,即块的最低使用率为2/3,而 B+树的块的最低使用率为1/2
3、B* 树分配新节点的概率比 B+ 树要低,空间使用率更高
2-3 树
1、2-3 树是最简单的 B 树结构,由二节点和三节点构成的树
2、所有叶子节点都在同一层
3、二节点:有两个子节点的节点,二节点要么没有子节点,要么有两个子节点
4、三节点:有三个子节点的节点,三节点要么没有子节点,要么有三个子节点
5、2-3 树的某三节点,其左节点所有元素小于其最小元素,其右节点所有元素大于其最大元素,中间节点所有元素介于其两元素之间
6、2-3-4 树相比 2-3 树,多出一个四节点,性质、插入、删除规则类似
2-3-4 树插入元素
1、添加元素时遵循向上生长
2、若插入该元素后该节点中有了四个元素(即该节点将变为五节点),要将原节点中三个元素中间的元素作为父节点上提,并将对于原节点左右元素分别作为父节点的左右子节点
3、插入元素与原节点左右元素对比,根据排序规则进入左/右子节点
4、对于上提的元素与原节点父节点元素结合,若结合后是四个元素,重复步骤2、步骤3
2-3-4 树的删除
1、若在节点中删除指定元素并不改变树的结构会直接删除,后不做其他操作
2、若删除指定节点后会影响节点平衡就会向与之最近的多余节点的节点借,通过父节点间接借
3、若在整个树中没有可以借的节点就会通过降低层数的方式维持输的平衡
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战