字典树存在的意义
1. 字典树 曾经遇到这样一个问题:很多单词,这些单词只含小写字母,并且不会有重复的单词出现,现在要统计出以某个字符串为前缀的单词数量,单词本身也是自己的前缀。先看看用常规的方法解决这个问题的复杂度。假设单词表容量为M,需要统计的前缀数量为N,前缀的平均长度是L,则常规算法思路是:对于每个前缀搜索每个单词,看看这个前缀是不是这个单词的前缀,如果是数量+1。这样的话时间复杂度为O(N*M*L),如果N相当大的话,这个算法的复杂度将无法接受啦。其实这就是字典树的典型应用啦。 我们先学习一下字典树,在解决上面的问题。字典树又称trie树,从名字上看很显然是一种树形结构了。字典树有以下几个特点:1.利用串的公共前缀,节约内存;2.根结点不包含任何字母;3.其余结点仅包含一个字母;4.每个结点的子节点包含字母不同。看看一个例子吧:下面就是一个字典树(图片来自百度百科) 上面的树就是一颗典型的字典树了,字典树中存储的单词包括:abc、abcd、abd、b、bcd、efg、hig,即:所有标记为红心的才是单词的结尾字母。对比上面的trie树的特点仔细看一下,理解一下到底什么是字典树。实际上字典树包括常见的两种种操作是:查找和插入操作。我觉得有必要看看字典树的基础代码:( 代码 ) View Code 1 //字典树的每个节点 2 struct node 3 { 4 bool