目录
AVL树:平衡二叉树、平衡二叉搜索树,最早的平衡二叉树之一。应用相对其他数据结构比较少。windows对进程地址空间的管理用到了AVL树。
红黑树: 平衡二叉树,广泛用在C++的STL中。如map和set都是用红黑树实现的。
B/B+树: 用在磁盘文件组织 数据索引和数据库索引。
Trie树(字典树): 用在统计和排序大量字符串,如自动机。
红黑树
红黑树的5个性质: (1)每个节点或者是黑色,或者是红色。
红黑树从根到叶子的最长路径不会超过最短路径的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) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。 其他操作类似处理
|