天天看点

Trie树入门及训练

什么叫trie树?

trie树即字典树。

又称单词查找树,,是一种,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比高。

(以上来自百度百科,点)

在我看来,trie树是一棵26叉树(如果是统计字母的话),典型的空间换时间。那到底我们利用trie来做什么呢?

1.统计单词

2.匹配前缀

千篇一律地需要提到其性质:

1.根节点不包含字符,除根节点外的每一个子节点都只包含一个字符。

2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串

3.每个节点的所有子节点包含的字符都不相同。

而其效率主要体现,通过公共前缀尽可能减少查找复杂度。

下面,没拍过字典树的同学就跟着来练习吧!很快你就有感觉了。

首先,发一个模板,我是一个从开始学习语言就写c++的人,所以我用了模板+类来写,喜欢c风格的同学也可以看看其他人共享的模板。(感觉有点长~但是相对我觉得好理解,假设你知道并且喜欢用template.)

Trie树入门及训练
Trie树入门及训练

view code

之后,怎么少得了经典的问题呢?

hdu1251(统计难题)

字典树做这些问题就是神器啊。注意统计的时候,node的处理,也就是insert和find的一些改变。

Trie树入门及训练
Trie树入门及训练

hdu1671

Trie树入门及训练
Trie树入门及训练

hdu1004,或许你用map水过去了,但是你不妨试试用字典树获取0ms吧!

Trie树入门及训练
Trie树入门及训练

hdu1075

这题目还是很赤裸的字典树,但是我犯了一个小错,让我wa无数次。

ac的:

Trie树入门及训练
Trie树入门及训练

wa的:

Trie树入门及训练
Trie树入门及训练

(差别就在字符串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)

Trie树入门及训练
Trie树入门及训练

 尽管我上面这个做法已经ok了,但是这是参考了别人,下面是我完全按自己想法写的,程序员最高兴的莫过于可以将自己的想法实现。

Trie树入门及训练
Trie树入门及训练

hdu1857,逆向思维的trie,可以参考我之前写过的,点

Trie树入门及训练
Trie树入门及训练

继续阅读