TrieTree的学习

什么是TrieTree?

Trie树,是一种非常重要的数据结构,又称字典树,查找单词树或者前缀树(Prefix Tree),是一种用于快速检索的多叉树结构,同时,它也是很多算法和复杂数据结构的基础,如后缀树,AC自动机等。

字典树(Tire)可以保存一些字符串->值的对应关系。基本上,跟Java的HashMap功能相同,都是key-value的映射,只不过Trie的key只能是字符串。是一种哈希树的变种。

Trie树可以利用字符串的公共前缀来节约存储空间。

如下图构建的Trie树用10个节点保存5个单词,and,as,at,cn,com:

 

从上面的图中,我们可以发现Tire树的一些特性:

  • 根节点不包含字符,除根节点外的每一个子节点都包含一个字符;
  • 从根节点到某一节点,路经上经过的字符连接起来,就是该节点对应的字符串;
  • 每个单词的公共前缀作为一个字符节点保存,每个节点的所有子节点包含的字符串不相同;

TrieTree的优缺点

,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

  • 优点

  Trie树强大之处就是在于它的时间复杂度,插入和查询的效率都是O(n),n是待插入、查询的字符串的长度,而与Trie中保存了多少个元素无关。

  关于查询,可能会说Hash表时间复杂度是O(1)不是更快?但是Hash搜索的效率通常取决于Hash函数的好坏,若一个坏的Hash函数导致很多的冲突,效率并不一定比Tire结高。而Trie树中不同的关键字就不会产生冲突,它只有在允许一个关键字关联多个值的情况下才有类似Hash碰撞。此外,Trie树不用求hash值,对短字符串有更快的速度,因为求hash值也是需要遍历字符串的。

  • 缺点

  当hash函数很好时,Tire树的查找效率会低于Hash搜索。

  另外,Tire树的核心思想是空间换时间,所以它的空间消耗较大。

TrieTree的基本实现

Tire树的插入、删除、查找都不是很难,用一个一重循环即可,即第i次循环找到前i个字母所对应的子树,然后进行相应的操作。

TrieTree的作用是什么?

Trie树是一种非常简单高效的数据结构,在字符串匹配等领域有广泛的应用。

  • 字符串检索

  事先把已知的一些字符串(字典)的有关信息保存到Trie树里,查找另外一些未知字符串是否出现过或者出现频率。

  • 字符串最长公共前缀

  Trie树利用多个字符串的公共前缀来节省存储空间,反之,当我们把大量字符串存储到一棵Trie树上时,我们可以快速得到某些字符串的公共前缀。

  • 排序

  Trie树是一棵多叉树,只要先遍历整棵树,输出相应的字符串便是按字典排序的结果。

  • 词频统计
  • 作为其它数据结构和算法的辅助结构

  如后缀树,AC自动机等。

TrieTree的复杂度

  • 插入、查找的时间复杂度都是O(n),n为字符串长度;
  • 空间复杂度是26^n级别的,非常庞大(可采用双数组实现来改良);
posted @ 2020-05-08 12:15  johnny_zhao  阅读(253)  评论(0编辑  收藏  举报