关于多串匹配

看到多串匹配,好多人会想到合肥网络赛那道DNA repair,然后又会想到大名鼎鼎的AC自动机,但其实我想说的是Tire图。

有些人说Tire图和AC自动机其实就是同一样东西,有些人又认为不是。本菜可以确定的是Trie图是一个DFA,但对上面的疑问实在不敢作断论,原因是没看过关于自动机理论的书,所以对AC自动机这个词不清楚,但是Trie图是可以在MAIGO大牛的论文里找到明确定义的东东,从定义上看我觉得它们是一样的。

如何理解Trie图呢?Trie图其实是KMP的失败数组(通常写作fail[],next[]或shift[])在Trie树上的扩展。回想到KMP的精髓是模板串通过自匹配产生失败数组的过程,这过程放到Trie图上就是模板串集合的自匹配,只不过失败指针的指向不再局限在一个模板串之内,而是可以从一个模板串的某个字符指向别的模板串的某个字符。构造所耗时间除了与KMP一样取决于模板串的长度外,还取决于字符集的大小|sigema|,因为需要保证所有Trie树中的非终态结点有完备的状态转移,这点反映到数据结构上就是每个结点都有|sigema|条出边,原Trie树中出边不足的结点需要补边。可以说Trie图=Trie树+KMP,所以看Trie图前一定要有Trie树和KMP的基础,两者缺一不可。

按上面的思想构造了Trie图,接下来就是进行多串匹配了。上面说了Trie图是一个DFA,如何体现A(utomatic)呢?很简单,把DFA比喻为榨汁机,文本串比喻为青瓜,O(L)塞进去,就出来青瓜汁了。

以上只算是一些感性认识,详细的介绍可以看WC2006 MAIGO大牛的文章。

你可能感兴趣的:(匹配)