Trie树 与 三分树(Ternary Trees)

总结

为什么用Trie树?

  1. 词频统计
    可能有人要说了,词频统计简单啊,一个hash或者一个堆就可以打完收工,但问题来了,如果内存有限呢?还能这么玩吗?所以这里我们就可以用trie树来压缩下空间,因为公共前缀都是用一个节点保存的。

  2. 前缀匹配
    如果and,as,at,我想获取所有以”a”开头的字符串,如果不用trie树,你该怎么做呢?很显然朴素的做法时间复杂度为O(N2),那么用Trie树就不一样了,它可以做到h,h为你检索单词的长度,可以说这是秒杀的效果。

为什么使用Ternary tree?

  1. Trie树结构,它的实现简单但空间效率低。如果要支持26个英文字母,每个节点就要保存26个指针,假若我们还要支持国际字符、标点符号、区分大小写,内存用量就会急剧上升,以至于不可行。
  2. 由于节点数组中保存的空指针占用了太多内存,我们遇到的困难与此有关,因此可以考虑改用其他数据结构去代替,比如用hash map。
  3. 然而,管理成千上万个hash map肯定也不是什么好主意,而且它使数据的相对顺序信息丢失,所以我们还是去看看另一种更好解法——Ternary Tree。

Ternary tree 与 hash比较:

Ternary tree 效率高而且容易实现;
Ternary tree 大体上效率比hash来的快,因为当数据量大的时候hash出现碰撞的几率也会大,而Ternary search tree 是指数增长;
Ternary tree 增长和收缩很方便,而 hash改变大小的话则需要拷贝内存重新hash等操作;
Ternary tree 支持模糊匹配,哈密顿距离查找,前缀查找等操作;
Ternary tree 支持许多其他操作,比如字典序输出所有字符串等,trie也能做,不过很费时;


Trie树

基本概念:

称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。

举例说明:

下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?

Trie树 与 三分树(Ternary Trees)_第1张图片

Ternary Tree

基本概念:

有三个只节点,在查找的时候,比较当前字符,如果查找的字符比较小,那么就跳到左节点.如果查找的字符比较大,那么就跳转到友节点.如果这个字符正好相等,那么就走向中间节点.这个时候比较下一个字符。

举例说明:

Trie树 与 三分树(Ternary Trees)_第2张图片

比如要查找”ax”:

  1. 先比较”a” 和 “i”, “a” < “i”,跳转到”i”的左节点;
  2. 比较 “a” < “b”, 跳转到”b”的左节点;
  3. 比较”a” = “a”,跳转到 “a”的中间节点,并且比较下一个字符”x”;
  4. 比较”x” > “s” , 跳转到”s” 的右节点;
  5. 比较 “x” > “t” 发现”t” 没有右节点了;
  6. 找出结果,不存在”ax”这个字符;

你可能感兴趣的:(算法)