树(扩展)

目录

红黑树

B树、B+树

Trie树(前缀树/字典树/单词查找树)


AVL树:平衡二叉树、平衡二叉搜索树,最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。 

红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。

B/B+树: 用在磁盘文件组织 数据索引和数据库索引。 

Trie树(字典树): 用在统计和排序大量字符串,如自动机。

 

红黑树

红黑树的5个性质:

1)每个节点或者是黑色,或者是红色。
2)根节点是黑色。
3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NILNULL)的叶子节点!]
4)如果一个节点是红色的,则它的子节点必须是黑色的。
5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

 

 

红黑树从根到叶子的最长路径不会超过最短路径的2倍

 

红黑树与avl树的区别:

红黑树是牺牲了严格的高度平衡的优越条件

红黑树的插入删除效率比AVL树高

插入时AVL树和红黑树最多都需要旋转2次

删除时,RB最多3次,但是AVL最多达到o(logn)次

由于AVL树更为平衡,所以容易引起unbalance,但是他的search效率更好

 

红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多 多一次比较,但是,红黑树在插入和删除上胜于avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转(左旋与右旋)的开销,相较于avl树为了维持平衡的开销要小得多,即维护更加方便

 

 

B树、B+树

磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。

 

B

这里的B树,也就是英文中的B-Tree,一个 m 阶的B树满足以下条件:

1、每个结点至多拥有m棵子树;

2、根结点至少拥有两颗子树(存在子树的情况下);

3、除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树;

4、所有的叶结点都在同一层上;

5、有 k 棵子树的分支结点则存在 k-1 个关键码,关键码按照递增次序进行排列;

6、关键字数量需要满足ceil(m/2)-1 <= n <= m-1;

 

 

B+

为什么要B+树

由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫描,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引,而B树则常用于文件索引。

 

一个m阶B+树:

1、根结点只有一个,其分支数量范围为[2,m];

2、分支结点,每个结点包含分支数范围为[ceil(m/2), m];//B-树范围左右都要-1

3、所有叶子结点都在同一层;

4、非叶子节点的子树指针与关键字个数相同;

5、为所有叶子节点增加一个链指针;

6、所有关键字都在叶子节点出现(稠密索引). (且链表中的关键字恰好是有序的);

7、非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储(关键字)数据的数据层

B树与B+树的区别:

1、关键字的数量不同;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的作用,B树虽然也有m个子结点,但是其只拥有m-1个关键字。

2、存储的位置不同;B+树中的数据都存储在叶子结点上,也就是其所有叶子结点的数据组合起来就是完整的数据,但是B树的数据存储在每一个结点中,并不仅仅存储在叶子结点上。

3、分支结点的构造不同;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。

4、查询不同;B树在找到具体的数值以后,则结束,而B+树则需要通过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程中一定走了一条从根结点到叶子结点的路径。

5、叶子节点不同:B+树的相邻叶子节点之间有指针指向下一个节点,而B树没有

 

为什么说B+树比B树更适合数据库索引?

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

 

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

 

3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

 

4、B树在提高了IO性能的同时并没有解决元素遍历的效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低。

 

Trie树(前缀树/字典树/单词查找树)

典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

 

它有3个基本性质:

1、根节点不包含字符,除根节点外每一个节点都只包含一个字符;

2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;

3、每个节点的所有子节点包含的字符都不相同。

 

其基本操作有:查找、插入和删除,当然删除操作比较少见。

 

实现方法

搜索字典项目的方法为:

(1) 从根结点开始一次搜索;

(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

(4) 迭代过程……

(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

其他操作类似处理

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值