B B+运用在file system database这类持续存储结构,一样能保持lon(n)的插入与查询,也须要额外的平衡调节。像mysql的数据库定义是能够指定B+ 索引仍是hash索引。mysql
C++ STL中的map就是用红黑树实现的。AVL树和红黑树都是二叉搜索树的变体,他们都是用于搜索。由于在这些书上搜索的时间复杂度都是O(h),h为树高,而理想情况是h为n。因此构造的办法就是把二叉搜索树改形成AVL树或者红黑树,AVL树是严格维持平衡的,红黑树是黑平衡的。可是维持平衡又须要额外的操做,这也加大了数据结构的时间复杂度,因此红黑树能够看作是二叉搜索树和AVL树的一个折中,能够尽可能维持树的平衡,又不用话过多的时间来维持数据结构的性质。linux
AVL树:平衡二叉树,通常是用平衡因子差值决定并经过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件很是严格(树高差只有1),只要插入或删除不知足上面的条件就要经过旋转来保持平衡。因为旋转是很是耗费时间的。咱们能够推出AVL树适合用于插入删除次数比较少,但查找多的状况。nginx
应用相对其余数据结构比较少。windows对进程地址空间的管理用到了AVL树。sql
红黑树:平衡二叉树,经过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其余路径长2倍,于是是近似平衡的。因此相对于严格要求平衡的AVL树来讲,它的旋转保持平衡次数较少。用于搜索时,插入删除次数多的状况下咱们就用红黑树来取代AVL。数据库
红黑树应用比较普遍:windows
· 普遍用在C++的STL中。map和set都是用红黑树实现的。数据结构
· 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块。搜索引擎
· epoll在内核中的实现,用红黑树管理事件块排序
· nginx中,用红黑树管理timer等索引
· Java的TreeMap实现
B树,B+树:它们特色是同样的,是多路查找树,通常用于数据库中作索引,由于它们分支多层数少,由于磁盘IO是很是耗时的,而像大量数据存储在磁盘中因此咱们要有效的减小磁盘IO次数避免磁盘频繁的查找。
B+树是B树的变种树,有n棵子树的节点中含有n个关键字,每一个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文件系统而生的。
B+树相对B树磁盘读写代价更低:由于B+树非叶子结点只存储键值,单个节点占空间小,索引块可以存储更多的节点,从磁盘读索引时所需的索引块更少,因此索引查找时I/O次数较B-Tree索引少,效率更高。并且B+Tree在叶子节点存放的记录以链表的形式连接,范围查找或遍历效率更高。Mysql InnoDB用的就是B+Tree索引。
Trie树:
又名单词查找树,一种树形结构,经常使用来操做字符串。它是不一样字符串的相同前缀只保存一份。
相对直接保存字符串确定是节省空间的,可是它保存大量字符串时会很耗费内存(是内存)。
相似的有:前缀树(prefix tree),后缀树(suffix tree),radix tree(patricia tree, compactprefix tree),crit-bit tree(解决耗费内存问题),以及前面说的double array trie。
前缀树:字符串快速检索,字符串排序,最长公共前缀,自动匹配前缀显示后缀。
后缀树:查找字符串s1在s2中,字符串s1在s2中出现的次数,字符串s1,s2最长公共部分,最长回文串。
trie 树的一个典型应用是前缀匹配,好比下面这个很常见的场景,在咱们输入时,搜索引擎会给予提示。
在大型文件系统中,采用索引能够有效的提升查找的效率,创建文件时,在输入数据记录的同时,创建一张索引表,每一个索引表项记录相应数据块的地址。检索文件记录时,先将外存上的索引表读入内存,从索引表中查到数据记录的地址后,再将相应的记录读入内存。若是文件中的数据在使用过程当中记录变化较多,则要频繁地对索引表进行插入和删除操做,这时对索引表采用树型结构较好。可是若是文件系统很大,则索引表也每每很大,需分块读入内存,若采用二叉查找树的结构,仍需屡次访问外存,而访问外存的代价很大,为了减小访问外存的次数,就应尽可能减小索引表的深度。简要介绍一下普遍应用于大型文件系统中的B-树。