算法设计与分析——字典树(前缀树、Trie树)

分类目录:《算法设计与分析》总目录
相关文章:
·字典树(前缀树、Trie树)
·实现数据结构字典树(前缀树、Trie树)


字典树又称单词查找树、前缀树、Trie树等,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它可以利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。它还有很多变种,如后缀树、Radix Tree、PATRICIA tree、crit-bit tree等等。

定义

在计算机科学中,Trie树(前缀树/字典树)是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

Trie树中的键通常是字符串,但也可以是其它的结构。Trie树的算法可以很容易地修改为处理其它结构的有序序列,比如一串数字或者形状的排列等等。

基本性质

Trie树的基本性质如下:

  • 根节点不包含字符,除根节点意外每个节点只包含一个字符。
  • 从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
  • 每个节点的所有子节点包含的字符串不相同。

Trie树的优点:

  • 可以最大限度地减少无谓的字符串比较,故可以用于词频统计和大量字符串排序。

Trie树缺点:

  • 虽然不同单词共享前缀,但其实Trie树是一个以空间换时间的算法。其每一个字符都可能包含至多字符集大小数目的指针(不包含卫星数据)。
  • 如果数据存储在外部存储器等较慢位置,Trie树会较hash速度慢。hash访问 O ( 1 ) O(1) O(1)次外存,Trie访问 O ( h ) O(h) O(h) h h h为树高。
  • 长的浮点数等会让链变得很长。可用bitwise trie改进。

每个结点的子树的根节点的组织方式有几种:

  • 如果默认包含所有字符集,则查找速度快但浪费空间(特别是靠近树底部叶子)。
  • 如果用链接法(如左儿子右兄弟),则节省空间但查找需顺序遍历链表。
  • 减少字符宽度以减少字母集个数。
  • 对字符集使用bitmap,再配合链接法。
应用场景
字符串检索

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

  • 给出 N N N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
  • 给出一个词典,其中的单词为不良单词。单词均为小写字母。再给出一段文本,文本的每一行也由小写字母构成。判断文本中是否含有任何不良单词。例如:若rob是不良单词,那么文本problem含有不良单词。
  • 1000万个字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。
排序

Trie树是一棵多叉树,只要先序遍历整棵树,输出相应的字符串便是按字典序排序的结果。比如给出 N N N互不相同的仅由一个单词构成的英文名,让你将它们按字典序从小到大排序输出。

字符串最长公共前缀

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

字符串搜索的前缀匹配

Trie树常用于搜索提示:如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。Trie树检索的时间复杂度可以做到 O ( n ) O(n) O(n) n n n是要检索单词的长度,如果使用暴力检索,需要指数级 O ( n 2 ) O(n^2) O(n2)的时间复杂度。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

von Neumann

您的赞赏是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值