一个Aho-Corasick算法的C++实现

本文介绍了Aho-Corasick算法的基本原理及其在C++中的实现。该算法能够在大字符串中高效查找多个小字符串的精确匹配,避免了多次遍历。文章提供了伪代码解释算法流程,并给出了具体的C++代码示例,包括状态转移函数和失败指针数组。通过示例数据演示了算法的应用,展示了一个自动机图的生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍:

Aho Corasick算法,简单的说就是用来在一个“大字符串”中查找精确匹配的某些“小字符串”的,发明者是Alfred V. Aho和Margaret J. Corasick。(向两位前辈致敬,orz)

这个算法的牛逼之处在于,只需要一次遍历便可以找出所有匹配的“小字符串”,因此算法复杂度为O(n+m+z)。而一个普通的匹配算法可能需要O(n+km)。

n = 所有“小字符串”的累计长度

m = “大字符串”长度

z = "小字符串"在"大字符串"里累计出现的次数

k = "小字符串"的个数 

 

更多关于Aho Corasick算法,这里的一个课件讲得非常清楚: http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf 

大家也可以去wikipedia: http://en.wikipedia.org/wiki/Aho-Corasick_algorithm.

伪码:
//g(q,a)返回值为:从当前状态q接受输入字符a后应转入的下一个状态

//f(q)返回值为:在当前状态q接受无法匹配的字符后应转入的下一个状态 (当有多个候选状态时,就看谁的路径能匹配当前状态的路径的尽可能长的后缀)

//out(q)返回值为:当前状态可以输出的匹配的“小字符串”(注意,可以是多个)

 

q := 0; // initial state (root)
for i := 1 to m do
    while g(q, T[i]) = null do
        q := f(q); // follow a fail
    q := g(q, T[i]); // follow a goto
    if out(q) != null; then print i, out(q);
end for;

例子:

这里给出的例子的数据为:

小字符串: {a, ab, bc, bca, c, caa}
大字符串: abccab

 

附有“小字符串”库生成的自动机图:

(图片质量比较糙,因为是用windows画图程序手工画的,请见谅。) 

(图中带有字符的箭头对应g(q,a),不带字符的箭头对应f(q),节点旁边的括号内字符为输出)

Aho Corasick算法的自动机

 

C++代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值