1. 问题原型:
给定一篇网页,其中有很多敏感词汇或者无效的词,需要找到一种算法,找到这些敏感词。
2. 如何求解呢?
2.1 第一个简单的思路是:
step1: for i = 0 to in #text
step2: foreach pattern p
step3: 比较 text[i+j] and p[0+j] where j = 0 to #p
这个思路最大问题是,逐个比较每个文本和每个模式,算法的复杂度是O(m*n*k),m是文本长度,n是pattern个数,k是所有pattern的总长度。my god!可想而知,这样的算法是不可容忍的。那么有哪些改进方法呢:
首先, hash_map 可以减少大量的比较。
其次, 对一个模式的比较,有很多算法如: KMP和Boyer-Moore。这两个改进的算法思想是:比较过的文本就不需要在比较了,直接shift 模式而不需要回溯Text,这两个算法可以看这里。以后有机会详细讨论这些。多模式匹配算法也是可以有类似的方法。
我们知道,单模式匹配算法的复杂度可以达到O(m+n),所以最基本的改进是:
2.2. naive muti-pattern match
step1: foreach pattern p
step2: 执行 O(m+#p)的单模式匹配算法
算法复杂度是: O(m + #P1 + m + #P2 + …… + m + #pn) = O( n*m + k)
好慢!如果模式的个数有几百万个,速度是不可忍受
3. 有哪些算法解决多模式匹配问题:
AC (Aho-Corasick algorithm)
ACBM(CW)[ A String Matching Algorithm Fast on the Average ]
WM [Wu