AVL RBtree
B B+
Trie
AVL早期有应用在linux内核上,后来被RBtree代替了,具体是用在哪个模块上,sorry,我忘了,求知欲那么强的你,google一下就有答案了,两者都保持log(n)的插入与查询,是平衡的BST,不会出现(n2)的糟糕情况,那为什么linux内核要用RBtree替代AVL呢,我没具体了解过,但从原理上看,个人猜想是AVL需要大量的旋转来保持平衡,而RBtree的旋转调节可能会少些,这是个人的臆断,真心希望有深入理解的同仁指正,用力的拍,另外我们熟悉的STL的map容器底层是RBtree,当然指的不是unordered_map,后者是hash。
而 B B+则运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节。像mysql的数据库定义是可以指定B+ 索引还是hash索引。
trie树大都用在word的匹配,但单纯的trie内存消耗很大,建trie树也需要些时间,通常用在带词典的机械分词,jieba分词就是建立在trie上匹配的,trie有其他变体可以压缩空间,像double array trie这类比较老且经典的压缩方法,也有其他比较新的压缩方式,看论文时有看过,没自己实现过所以不断言了,其实面对多模匹配trie没有其变体aho-corasick来得理想,另外aho-corasick也是可以用巧妙的方法来进行压缩空间,这里不再展开,毕竟手机码字,同时想基数树与其也类似,在nginx上有应用,说到aho-corasick其实早期的入侵检测工具snort也有应用实现,但如今改成wu-menber了,具体记不清了,其实trie还是挺有用的,Tengine也用trie实现了了匹配模块。但要是用在大量单词的匹配上确实吃内存。
作者:Justin
链接:https://www.zhihu.com/question/30527705/answer/52843214
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。