今天做索引结构,看了一些不同的树的知识,这里简单的总结了一下。
二叉查找树 (Binary Search Tree)
这个相信大家比较熟悉,BST的查找最好时间复杂度O(logN),最坏时间复杂度O(N)。
平衡二叉树(AVL):
查找代价和插入代价:O(logN)级别上
删除操作的时间复杂度为O(logN)+O(logN)=O(2logN)
二叉平衡树的严格平衡策略以牺牲建立查找结构(插入,删除操作)的代价,换来了稳定的查找时间复杂度O(logN) 。如果说再去找一种折中策略,即不牺牲太大的建立查找结构的代价,也能保证稳定高效的查找效率呢? ——红黑树。
红黑树 (Red-Black Tree )
查找效率最好情况下时间复杂度为O(logN),
但在最坏情况下比AVL要差一些,
但也远远好于BST。
总体评价:大量数据实践证明,RBT的总体统计性能要好于平衡二叉树。
其实在我项目中具体用的是B+树,具体B树的知识我在这里不再重复,可以参考下http://blog.csdn.net/hguisu/article/details/7786014这篇说的很详细。
标准 Trie树
所有含有公共前缀的字符串将挂在树中同一个结点下。实际上trie简明的存储了存在于串集合中的所有公共前缀。
总结:一个存储长度为n,来自大小为d的字母表中s个串的集合X的标准trie具有性质如下:
(1) 树中每个内部结点至多有d个子结点。
(2) 树有s个外部结点。
(3) 树的高度等于X中最长串的长度。
(4) 树中的结点数为O(n)。
标准Trie树的应用和优缺点
(1) 全字匹配:确定待查字串是否与集合的一个单词完全匹配。如上代码fullMatch()。
(2) 前缀匹配:查找集合中与以s为前缀的所有串。
优点: 查找效率比与集合中的每一个字符串做匹配的效率要高很多。在o(m)时间内搜索一个长度为m的字符串s是否在字典里。
缺点:标准Trie的空间利用率不高,可能存在大量结点中只有一个子结点,这样的结点绝对是一种浪费。正是这个原因,才迅速推动了下面所讲的压缩trie的开发。
注意:Trie树的结构并不适合用来查找子串匹配