AC多模匹配算法小结

来源:互联网 发布:某算法的时间复杂度是 编辑:程序博客网 时间:2024/05/22 15:29
 
AC多模匹配算法小结
1AC算法的原理
本程序采用了AC的多模匹配方法。Aho_Corasick自动机匹配算法是最著名的多模匹配算法之一。该算法在1975年产生于贝尔实验室。
AC自动机匹配算法基于一种精巧的模式树(Trie)性质的一棵树K;
1.         的每一条边e上都用一个字符作为标签;K
2.         与同一节点相连的边的标签均不同;
3.         每一个模式p∈P,都存在一个节点v,使得L(v)=p,其中L(v)表示从根节点到v所经过的所有边上的标签的联合拼接;
4.         每一个叶子节点v’都存在一个模式p∈P使L(v’)=p。
对于模式集{he,she,his,hers },模式树如图所示"其中圆圈表示节点双圈是根节点边上的字符就是该边的标签粗圈的标签就是各个模式!
 
图1 模式树(Trie)
有限自动机的基本思想是根据输入和当前的状态决定下一个状态和输出,接着再进入下一次输入。在字符串多模式匹配中,向自动机输入所要查找的目标字符串,自动机可以输出查找到的模式串以及模式串在目标串的位置。有限自动机的构造过程是将模式串集合变换成由转向函数,失效函数和输出函数所组成的树型有限自动机。模式匹配的处理过程就变成了状态转换的处理过程,由“start”状态开始。
这样,在主串中查找模式的过程转化成在模式树中的查找过程。查找一个串T时从模式树的根节点开始沿着以2 中字符为标签的路径往下走:
1.         若自动机能够抵达终态r,则说明T中存在模式L(v);
2.         否则说明T中不存在模式。
照AC自动机匹配算法要求构造AC自动机。自动机的具体构造过程可以分为两个阶段,其构造过程如下,第一阶段构造攻击特征模式库中的同类型攻击特征模式P={p1,…,ps}的模式树.
从唯一的根节点0开始,一个接一个地插入pi;尽可能沿着以pi中字符为标签的路径进行,如果pi在节点v中止,在v中标上记号作为pi的标识符,如果在pi中所有字符使用完前路径中止,则继续以pi中剩下的字符作为边上的标签加入节点。
完成根节点的G转向函数,对于不是根节点出来的边上的标签,那么g(0,a)=0
第二阶段完成F失效函数
这个函数都是在Trie树上以广度优先的方式得到的。假设我们要得到一个节点的f函数值的时候,假设那些比这个节点更靠近根节点的f函数值已经得到,考虑节点r和u=g(r,a)根据定义知道节点r 是节点u的父节点,并且L(u)=L(r)a,f(u)就是以L(u)最长真后缀为标签的离根节点最远(最深)的那个节点。
图2 AC自动机的一个图例
以{he,she,his,hers }关键词向量组,构造出来的自动机如图5-3所示,其中细虚线为失效函数,没有给出的都指向根节点,粗实线为转向函数,细圈为自动机各个状态,粗圈为终态,双圈为初始态。
有限自动机的构造中,每个模式串的字符是从前到后依次加到树型的有限自动机中的,在匹配时,目标串的输入,即匹配过程,也是按照从前到后的次序。
利用已构成的有限自动机进行多串一遍查找的过程如下 :
1、从有限自动机的 0状态出发,从目标字符串的第一个字符开始正向逐个取出的字符t,并按转向函数G(S,t)或失效函数F(S)进入下一状态。
2、当输出函数P(S)不为空时,输出P(S)。
   
2.具体实现算法
算法1.构造转向函数
输入:关键字集合K={T1,T2,…,Tk}
输出:生成自动机的状态集合,转向函数g和匹配成功的输出函数p。
方法:假定初始状态s被创建时输出函数p(s)是空的,函数enter(Ti)在状态转换表中插入一个能拼写出Pi的路径。
begin
ns←0
for i←1 until k do enter(Ti)
for 每一个使g(0, a) 不存在的a do g(0, a)←0
end
 
Proc enter(t t t ):
begin
s←0; j←1
while g(s, t ) 存在do
begin
s←g (s, t )
j←j + l
end
 
for p←j until Li do
begin
ns←ns + 1
g (state, t )←ns
s←ns
end
 
p(s)←{ t ,t ,…t }
end
2、生成失效函数和更新输出函数的方法 :
算法2.构造失效函数
输入:转向函数g和由算法1得到的输出函数
输出:失效函数f和输出函数
 
begin
令Set为空
for 每一个使g(0, t) = s ≠ 0的t do
begin
Set ←Set∪{s } /*将s加入队列Set中*/
f (s):=0
end
 
while Set不为空 do
begin
令Q是Set的状态队列中头一个状态
Set ← Set - {Q}
for 每一个使g(Q, t) = w存在的t do
begin
Set ←Set∪{w}
s←f (Q)
while g (s, t) 不存在 do s:=f (s)
f (w) ← g(s, t)
p(w) ← p(w) ∪ p ( f ( w ) )
end
end
end
3、匹配过程
算法3:模式匹配自动机
输入:一个文本字符串T= t1 t2 …tn ,每个ti都是一个输入字符,一个有转向函数g,失效函数f和输出函数p构造成的自动机M。
输出:关键字在T中出现的位置和总个数。
begin
s←0
count=0
for j:=1 until n do
begin
while g (s, t )不存在do s ←f ( s )
s ← g (s, t )
if p(s)非空 do
begin
print j:,j
print p(s)
count=count+1
print count
end
end
end
3.有限自动机算法的分析
在预处理阶段构造有限状态自动机:①构造状态转换函数g的时间复杂度是O(M),M是所有模式的总长度。M=∑ |Ti|。②构造失效函数f所需要的时间也是O(M)。③最后由转向函数和失效函数可以构造一个单独的函数δ,描述了由一个当前的状态和一个输入字符可以进入的下一个状态。
在扫描阶段:按照预处理阶段构造的有限自动机逐一地查看文本T的每个字符,对T中的每个字符仅有一个状态转换函数,扫描阶段所需要的时间是O(n)。
    所以基于有限自动机算法的模式匹配的总时间为O(M+n),与文本长度及模式的总长度都有关,而与模式及文本的内容无关,也即最好,最坏及平均扫描时间均为O(M+n)。
基于自动机的多模匹配算法具有如下特点:简明性(原理和算法比较简单)、高效性(对文本一次扫描)、无关性(与模式及文本内容无关)、通用性(可适用与任何类型字符/汉字串的检索)。
    AC的局限性是对空间需求比较大,如果匹配模式太多,会造成空间的大量占用,甚至系统崩溃。所以在模式有限不多的模式下,AC是能够很好满足需求的要求的。
 
原创粉丝点击