Trie 用于前缀匹配,在搜索引擎的切词中有广泛的引用,但trie占有空间太多,因此有doube array trie,
参考文章:http://linux.thai.net/~thep/datrie/datrie.html
构建trie的方法主要有两种,一种是动态构建,如参考文章里的,另一种就是批量构建,算法如下:
将所有的输入词进行排序,例如输入词是ab,ac,cd,ef
则排好序后为:ab,ac,cd,ef
算法首先将每个单词的首字符拿出来,即a,c,e,注意这里有两个a,这个信息是需要被保存的,拿到a,c,e后,选出base来,由于这个base的所有下一个状态都已经找到,因此这个base是不会被改变的。下一次,首先从a出发,由于我们知道有两个单词从a开始,因此找出了b,c,重复上面的过程。需要注意的是单词的结尾,我们对每个单词后面加上一个不存在的字符0,来作为其结尾
关键数据结构,用于保存上面的每一个字符,需要记录有多少单词以这个字符开始,这个字符在这个单词里的位置,本次一共找到多少个字符,因此可以定义如下:
struct node
{
int left;
int right;
int found;
int depth;
}