什么叫trie树?
trie树即字典树。
又称单词查找树,,是一种,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比高。
(以上来自百度百科,点)
在我看来,trie树是一棵26叉树(如果是统计字母的话),典型的空间换时间。那到底我们利用trie来做什么呢?
1.统计单词
2.匹配前缀
千篇一律地需要提到其性质:
1.根节点不包含字符,除根节点外的每一个子节点都只包含一个字符。
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
3.每个节点的所有子节点包含的字符都不相同。
而其效率主要体现,通过公共前缀尽可能减少查找复杂度。
下面,没拍过字典树的同学就跟着来练习吧!很快你就有感觉了。
首先,发一个模板,我是一个从开始学习语言就写c++的人,所以我用了模板+类来写,喜欢c风格的同学也可以看看其他人共享的模板。(感觉有点长~但是相对我觉得好理解,假设你知道并且喜欢用template.)
view code
之后,怎么少得了经典的问题呢?
hdu1251(统计难题)
字典树做这些问题就是神器啊。注意统计的时候,node的处理,也就是insert和find的一些改变。
hdu1671
hdu1004,或许你用map水过去了,但是你不妨试试用字典树获取0ms吧!
hdu1075
这题目还是很赤裸的字典树,但是我犯了一个小错,让我wa无数次。
ac的:
wa的:
(差别就在字符串copy 上没有拷贝上‘\0‘……,也就是st[len])
hdu1247
题目相对理解上会有点偏差,不是当且仅当两个,是两个,举个例子
a
abc
b
bc
c
输出的是:abc,bc(注意abc也是,不要因为abc=a+b+c,而忽略,只要可以满足s=s1+s2即可,即abc=a+bc,bc=b+c)
尽管我上面这个做法已经ok了,但是这是参考了别人,下面是我完全按自己想法写的,程序员最高兴的莫过于可以将自己的想法实现。
hdu1857,逆向思维的trie,可以参考我之前写过的,点