ac多模式匹配 java_AC多模式匹配算法

建议:

学习ac算法最好的途径是看论文pdf_Efficient_String_Matching_An_Aid_to_Biblio

一、一般的搜索算法

keyword: { he, she, his, her }

text: "ushers"

06bc8fb487d88d4569aaeb3066cbab6f.png

ec0a8cb165a3c9bf1d469b2a533c7a28.png

总结:

如上图所示,一般的搜索过程需要每个关键字依次搜索,这是时间复杂度最高的算法。

当然,可以把每个关键字搜索过程优化为 KMP 或者 BM 算法,但仍然需要每个关键字都搜索一遍。

KMP、BM是单模匹配算法,使用多模匹配算法 AC 即可优雅解决此问题。

二、AC 算法的搜索过程

1.三个函数

goto 函数

71347d0550bac5292d8e5226ef1e8fa9.png

fail 函数

4d297ef77b08c70482da273f81430a3e.png

output 函数

feed7774015ae8eb7fbabb3f17f50c0f.png

省略了 output(state) = empty 的情况

2.算法一 - 搜索过程

keyword: { he, she, his, her }

text: "ushers"

2ae9c362bb61c87a048144927b3c1481.png

总结:

可以看到使用 AC 算法的搜索过程仅遍历了一次 text ,就找到了所有匹配 keyword。

搜索过程从状态0开始,通过 goto() 函数进行状态转换,每次转换状态都会执行 output() 函数,如果返回值不为空,说明匹配到关键字。goto() 函数返回 fail 的情况,执行 fail() 函数进行状态转换。

g(0,x) 没有失败的情况,至少会跳转到状态0

fail(x) 也没有失败的情况,至少会跳转到状态0

fail(x) 还存在优化的余地,假设 keyword 中没有 hers ,则这次 f(5) 就一次无用的跳转。

算法一:

60aafc6c39c0e34a03aea9243c09bb97.png

三、生成 goto() fail() output() 函数的过程

1.算法二 - 生成 goto() 函数 和 不完整的 output() 函数

构造 goto() 函数的过程就是生成 goto() 前缀树的过程。从仅有一个点(状态为0)的前缀树开始,逐个添加关键字到前缀树即可。

1.添加 "he" 关键字

ef40bdffceffe00cd7b4f4b08356cdd9.png

2.添加 "she" 关键字

0dc6027c6523734672d59cb90583d477.png]

3.添加 "his" 关键字

4ff04cf60cad9f8f90943f96c293eee4.png

4.添加 "hers" 关键字

9bdfe52103b435de981256e53abaf025.png

5.起点(状态0)作特殊处理,使 g(0, x) 永远不会返回 fail,x表示任意字符。

cde9897f7f7a9fcb34a079ab1543e321.png

总结:

output() 函数目前还不完整,比如 output(5) 应该为 {she, he } 才能完整匹配所有关键字。所以还需要另外一个算法完成 output() 函数。

算法二

2b37f0c3f4de8a1e5e7f71a01002d8ee.png

2.算法三 - 生成 fail() 函数 并补充 output() 函数

注:

为表述方便,此处虚拟了 state() 函数。

例如:state("he")表示字符串"he"在goto() 前缀树中所表示的状态值,并非真实存在的函数。

长度为1的字符串,其 fail() 返回值肯定是0。

情况1:2个字符串的 fail() 返回值

8916eb775cf0b61b31b2416c171874b4.png

情况2:3个字符串的 fail() 返回值

384ff3fec575bedeb94c4dfa10458cc5.png

情况3:4个字符串的 fail() 返回值

b4b6fc04bb8339ed66887c1e35aab797.png

情况4:4个字符串的 fail() 返回值。

这里与情况3有一点区别,字符串 "ashe" 的最长子串 "she" 并不是关键字,所以我们认为 "he" 是 "ashe" 的最长子串,所以字符串 "ashe" 的 fail() 返回值是 "he" 的状态值。

07d203793e936a72a01eafb5ce350b9d.png

总结:

以上4种情况,间接表示了 fail() 函数生成过程,尤其是伪代码中 while g(staet, a) = fail do state

算法三:

55698955ad203a54d4b4db1a551664e9.png

附件列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值