Trie树

转载自http://epic.32o.cn/article.asp?id=47,但是这个地址已经不存在了……
所以从维基百科拿来个图进行解释:http://zh.wikipedia.org/wiki/Trie

一个保存了 8 个键的 trie 结构,"A", "to", "tea", "ted", "ten", "i", "in", and "inn".

  今天在vijos有人问我trie树怎么弄。索性就写详细点,让众多新手参考一下。
  Trie树就是字符树,其核心思想就是空间换时间。举个简单的例子。
  给你100000个长度不超过10的单词。对于每一个单词,我们要判断他有没有重复给出,如果重复出现了,则给出第一次出现的位置。
  这题当然可以用hash来,但是我要介绍的是trie树,在某些方面它的用途更大,比如说对于某一个单词,我要查看它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。
  现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要在所有单词中查找是否有重复,那么这个算法的复杂度就是O(n^2),显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c,d,f之类开头的我显然不必考虑。而只要找以a开头的中是否存在abcd就可以了。同样的,在以a开头中的单词中,我们只要考虑以b作为第二个字母的……这样一个树的模型就渐渐清晰了。对于每一个节点,从根遍历到他的过程就是一个单词。那么,对于一个单词,我只要顺着他从跟走到对应的节点,再看这个节点是否存在就可以知道它是否出现过了。新建立节点则相当于插入新单词。这样一来我们询问和插入可以一起完成,所用时间仅仅为单词长度,在这一个样例,便是10。
  我们可以看到,trie树每一层的节点数是26^i 级别的。所以为了节省空间,我们用动态链表,或者用数组来模拟动态,空间的花费不会超过单词数×单词长度。
  程序非常好实现,区区几行,我就不写了,自己琢磨吧。如果还是不懂请留言。

转载于:https://www.cnblogs.com/RoyCNNK/articles/2969490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值