建议:
学习ac算法最好的途径是看论文pdf_Efficient_String_Matching_An_Aid_to_Biblio
html
keyword: { he, she, his, her }
text: "ushers"
算法
goto 函数函数
fail 函数学习
output 函数优化
省略了 output(state) = empty 的状况3d
keyword: { he, she, his, her }
text: "ushers"code
g(0,x) 没有失败的状况,至少会跳转到状态0
fail(x) 也没有失败的状况,至少会跳转到状态0
fail(x) 还存在优化的余地,假设 keyword 中没有 hers ,则此次 f(5) 就一次无用的跳转。htm
算法一:
blog
构造 goto() 函数的过程就是生成 goto() 前缀树的过程。从仅有一个点(状态为0)的前缀树开始,逐个添加关键字到前缀树便可。ci
1.添加 "he" 关键字
2.添加 "she" 关键字]
3.添加 "his" 关键字
4.添加 "hers" 关键字
5.起点(状态0)做特殊处理,使 g(0, x) 永远不会返回 fail,x表示任意字符。
总结:
output() 函数目前还不完整,好比 output(5) 应该为 {she, he } 才能完整匹配全部关键字。因此还须要另一个算法完成 output() 函数。
算法二
注:
为表述方便,此处虚拟了 state() 函数。
例如:state("he")表示字符串"he"在goto() 前缀树中所表示的状态值,并不是真实存在的函数。
长度为1的字符串,其 fail() 返回值确定是0。
状况1:2个字符串的 fail() 返回值
状况2:3个字符串的 fail() 返回值
状况3:4个字符串的 fail() 返回值
状况4:4个字符串的 fail() 返回值。
这里与状况3有一点区别,字符串 "ashe" 的最长子串 "she" 并非关键字,因此咱们认为 "he" 是 "ashe" 的最长子串,因此字符串 "ashe" 的 fail() 返回值是 "he" 的状态值。
总结:
以上4种状况,间接表示了 fail() 函数生成过程,尤为是伪代码中 while g(staet, a) = fail do state <- f(state)
的含义,即找到一个字符串的状态值,此字符串是当前关键词的最长后缀,同时又是其余关键词的前缀。而后 fail(s) 就等于咱们找到的这个状态值。
算法三: