数据结构之树
来源:互联网 发布:网络计算机与淘宝 编辑:程序博客网 时间:2024/05/20 12:23
一、树的基本概念
树(Tree)是元素的集合,树有多个节点可以存储元素
二、二叉树
每个节点最多有两个子节点的树称为二叉树;常用来做二分查找(Binary Search)等
三、B树
即二叉搜索树(Binary Search Tree),是一种特殊形态的二叉树
1、所有节点最多拥有2个子节点
2、所有节点存储一个关键字
3、非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树
B树从根节点开始查找,如果查询关键字等于节点则命中。否则,如果查询关键字小于节点关键字则进入左子树查找,如果查询关键字大于节点关键字则进入右子树查找;如果左或右子树指针为空,则表示没有找到匹配的结果。
如果B树的所有非叶子节点左右子树节点数目差不多(平衡),则B树的查找性能逼近二分查找。但它比连续内存空间的二分查找的优点是改变B树结构(插入或删除节点)不需要移动大段内存数据,通常是常熟开销。
但B树在经过多次插入或删除节点后会导致不同的结果,即不再平衡
四、平衡二叉树
平衡二叉树即是在B树的基础上添加了平衡算法,使其保持良好的查询性能
五、其他衍生B树
B-树、B+树、B*树都是多路搜索树,其中B+树是B-树的变体,B*树是B+树的变体
B-树是专门进行查找的多叉树,指针数量为关键字数加1,所有关键字只出现一次,非叶子节点可命中,性能相当于二分查找,避免了失平衡问题,但需要节点分裂和合并
1、B-树
1)所有非叶子节点最多有M个子节点;且M > 2
2)根节点的子节点数目为[2, M],非根非叶子节点的子节点数目为[M/2, M]
3)每个节点存放关键字的数量为M/2 -1(向上取整)到 M-1个(最少2个)
4)非叶子节点关键字个数 = 指向子节点指针个数 - 1
5)非叶子节点的关键字K[1]...K[M-1],且K[i] < K[i + 1]
6)非叶子节点的指针P[1]...P[M],P[1]指向关键字小于K[1]的子节点,P[M]指向关键字大于K[M - 1]的子节点;其他P[i]指向关键字属于(K[i-1],K[i])的子节点
7)所有叶子节点位于同一层
一颗三路B-树
B-树从根节点开始搜索,对节点内关键字(有序)序列进行二分查找,如果命中则结束;否则进入查询关键字所属范围的子节点;重复;直到所对应的子节点指针为空或已经是叶子节点
鉴于以上的定义使得B-树具有以下特性:
1)关键字集合分布在整棵树中
2)任何关键字出现且只出现在一个节点中
3)搜索有可能在非叶子节点结束
4)搜索性能等价于在关键字全集内做一次二分查找
5)自动层次控制
由于除根以外的非叶子节点至少有M/2个子节点,能够确保节点的最低利用率,最差搜索性能为:
说明:M为最大子节点个数,N为关键字总数;可以看出B-树的查询性能与二分查找相同,都为O(log2n),与M值无关,也没有B树的平衡问题;但是由于M/2的限制,在插入或删除节点时需要对节点进行拆分或者合并操作
2、B+树
B+树是B-树的变体,指针数量与关键字数量相等,同一关键字可能出现多次,所有关键字都在叶子节点出现,并通过链表连接,适合文件系统
B+树的定义与B-树基本相同,除了:
1)非叶子节点的子节点个数与关键字个数相等
2)非叶子节点指针P[i]指向关键字属于[K[i], K[i+1]]的子节点(与B-树不同,B-树是开区间)
3)所有关键字都在叶子节点出现,并且所有叶子节点都含有一个链指针
例:最大子节点为3的B+树
B+树搜索与B-树相同,但是只在叶子节点才命中,性能也等价于一次二分查找
B+树的特性:
1)所有关键字都在叶子节点的链表中(稠密索引),而且是关键字有序的
2)不可能在非叶子节点命中
3)非叶子节点相当于叶子节点的索引(稀疏索引),叶子节点相当于存储数据(关键字)的数据层
4)适合文件索引系统
3、B*树
B*树是B+树的变体,在非根和非叶子节点层增加指向兄弟的指针,同时定义非叶子节点关键字个数至少为(2/3)M,即块的最低使用率为2/3(B+树为1/2)
分裂对比:
B+树:分配新节点时,将1/2的数据拷贝至新节点,在父节点中添加新节点的指针
B*树:先确定兄弟节点是否已满 (1) 如不满则先移动一部分数据到兄弟节点,再添加新关键字,最后修改父节点中的兄弟节点关键字;(2)如兄弟节点已满,则分配新的节点,并从自身和兄弟节点各移动1/3的数据到新节点,最后在父节点中添加新节点指针
相对于B+树,B*树通过兄弟节点的指针进一步提高空间利用率,并且降低了分配新节点的概率;但是操作相对复杂一些
简单小结:
B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;性能基本上等于二分查找,有失平衡问题
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;二分查找性能
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;二分查找性能
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;同样是二分查找性能
- 数据结构之树
- JAVA数据结构之树
- 数据结构之Trie树
- 数据结构之trie树
- 数据结构之【trie树】
- 数据结构之败者树
- 数据结构之Trie树
- 数据结构之二叉树
- 数据结构复习之【树】
- 数据结构之AVL树
- 数据结构之Trie树
- 数据结构之二叉树
- 数据结构之字典树
- 数据结构之Trie树
- 数据结构之Trie树
- 数据结构之线段树
- 数据结构之线段树
- 数据结构之线段树
- html5新增的语义标签
- No tag "datetimepicker" defined in tag library imported with prefix "s"
- Nodejs,Grunt配置sass自动编译成css
- (6)java的运算符
- KMP算法学习笔记
- 数据结构之树
- WPF scrollviewer 无法滚动的原因
- 深入理解Linux内核(4)---中断和异常(x86平台)
- 在java中,怎样把一个double数转换为字符串时,不用科学计数法表示。
- 笨方法学Python(31-35)
- VLAN间通信(单臂路由和SVI)
- 数据结构和算法经典100题-第33题
- VB.NET和C# Ruby语言之间的转换
- 策略模式