建立模式匹配状态机的方法及装置.pdf

上传人:e2 文档编号:971950 上传时间:2018-03-22 格式:PDF 页数:23 大小:1.03MB
返回 下载 相关 举报
摘要
申请专利号:

CN200810006076.X

申请日:

2008.02.01

公开号:

CN101499064A

公开日:

2009.08.05

当前法律状态:

驳回

有效性:

无权

法律详情:

发明专利申请公布后的驳回IPC(主分类):G06F 17/30公开日:20090805|||实质审查的生效IPC(主分类):G06F 17/30申请日:20080201|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

华为技术有限公司

发明人:

陈 建; 魏启坤; 陈国海

地址:

518129广东省深圳市龙岗区坂田华为总部办公楼

优先权:

专利代理机构:

北京集佳知识产权代理有限公司

代理人:

逯长明

PDF下载: PDF下载
内容摘要

本发明公开了一种建立模式匹配状态机的方法及装置,该方法包括:获取预定义的关键字集合;根据所述关键字集合生成迁移Goto函数;根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;根据Goto函数和Failure函数生成输出Output函数。利用本发明,可以减少模式匹配过程中低效的Failure链,提高模式匹配处理效率。

权利要求书

1、  一种建立模式匹配状态机的方法,其特征在于,包括:
获取预定义的关键字集合;
根据所述关键字集合生成迁移Goto函数;
根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;
根据Goto函数和Failure函数生成输出Output函数。

2、
  根据权利要求1所述的方法,其特征在于,所述根据生成的Goto函数构建Failure函数包括:
设置所有深度为1的状态的Failure状态为初始状态,并用状态0表示所述初始状态;
依次对深度为d-1的状态r执行以下步骤,以确定深度为d的状态s的Failure状态:
获取深度为d-1的状态r的Failure状态作为当前状态state,并执行以下步骤:
遍历输入符号集,判断在所述当前状态state输入所述输入符号时Goto函数是否失败,和所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集,所述输入符号集包含本模式匹配状态机可以使用的所有输入符号;
如果在所述当前状态state输入所述输入符号时Goto函数失败,或者所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集,则将所述当前状态state的Failure状态作为新的所述当前状态继续上述判断步骤;
如果在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集,则将所述当前状态state输入所述输入符号时Goto函数值作为深度为d的状态s的Failure状态;
如果在状态r输入所有的输入符号时,Goto函数均为失败,则结束状态r的处理。

3、
  根据权利要求2所述的方法,其特征在于,所述判断所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集的过程包括:
遍历所述输入符号集,如果存在满足以下条件的符号b:g(g(state,a),b)≠fail,并且g(s,b)=fail,其中a是在深度为d-1的状态r时的输入符号,则确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集;否则,确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集。

4、
  根据权利要求2或3所述的方法,其特征在于,所述方法还包括:
如果在所述当前状态state输入所述输入符号时Goto函数值为0,则将所述当前状态state输入所述输入符号时的Goto函数值作为深度为d的状态s的Failure状态。

5、
  根据权利要求2或3所述的方法,其特征在于,所述方法还包括:
如果在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集,并且当前状态state为0,则直接设置深度为d的状态s的Failure状态为0。

6、
  一种建立模式匹配状态机的装置,其特征在于,包括:
获取单元,用于获取预定义的关键字集合;
Goto函数生成单元,用于根据所述关键字集合生成Goto函数;
Failure函数生成单元,用于根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入所述输入符号集内任意符号时,该状态的Goto函数不会失败;
Output函数生成单元,用于根据Goto函数和Failure函数生成Output函数。

7、
  根据权利要求6所述的装置,其特征在于,所述Failure函数生成单元包括:
设置子单元,用于设置所有深度为1的状态的Failure状态为初始状态;
状态获取子单元,用于依次获取前一深度d-1的状态r的Failure状态作为当前状态state;
Failure状态生成子单元,用于遍历所述输入符号集,判断在所述当前状态state输入所述输入符号时Goto函数是否失败,和所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集;并在所述当前状态state输入所述输入符号时Goto函数失败,或者所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是当前深度d的状态s的可接受输入集的子集时,将所述当前状态state的Failure状态作为新的所述当前状态继续上述判断;在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集时,将所述当前状态state输入所述输入符号时Goto函数值作为深度为d的状态s的Failure状态;在状态r输入所有的输入符号,Goto函数均为失败时,结束对状态r的处理。

8、
  根据权利要求7所述的装置,其特征在于,所述Failure状态生成子单元按照以下过程判断所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集:
遍历所述输入符号集号,如果存在满足以下条件的符号b:g(g(state,a),b)≠fail,并且g(s,b)=fail,其中a是在深度为d-1的状态r时的输入符号,则确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集;否则,确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集。

9、
  根据权利要求7或8所述的装置,其特征在于,所述装置还包括:
第一判断单元,用于判断所述当前状态state输入所述输入符号时Goto函数为0时,将所述当前状态state输入所述输入符号时的Goto函数值作为深度为d的状态s的Failure状态。

10、
  根据权利要求7或8所述的方法,其特征在于,所述装置还包括:
第二判断单元,用于判断在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集,并且所述当前状态state为0时,直接设置深度为d的状态s的Failure状态为0。

说明书

建立模式匹配状态机的方法及装置
技术领域
本发明涉及模式匹配技术,具体涉及一种建立模式匹配状态机的方法及装置。
背景技术
模式匹配一般是指在文本数据中搜索预定义的关键字。模式匹配问题是计算机科学中的一个基本问题,其研究内容在信息检索、模式识别等众多领域均有重要价值,在拼写检查、语言翻译、数据压缩、搜索引擎、入侵检测、内容过滤、计算机病毒特征码匹配以及基因序列比较等应用中起着重要的作用。比如,在一些信息获取、文本编辑应用中,用户会指定一些关键字,需要在文本中快速定位关键字的位置。
Aho-Corasick(阿霍-克若思克)算法描述了一种简单有效的算法,能够在任意的文本中定位有限数目的关键字的所有位置。其原理是:首先根据这一系列关键字定义一个有限状态模式匹配机,然后把文本作为模式匹配机的输入。只要匹配到关键字,就会通报本关键字匹配成功。
以用户指定关键字集合{he,she,his,hers}为例,用户希望在文本搜索中出现任一个关键字,就输出搜索结果,通知用户。如图1所示,利用Aho-Corasick进行模式匹配的过程如下:根据关键字集合{he,she,his,hers}生成Goto函数、Failure、Output函数,包括两个步骤:第一步确定状态和Goto函数,第二步计算Failure函数。Output函数的构建在第一步开始,在第二步完成。
如图1(a)所示,根据关键字集合生成Goto函数(在算式中以g代表Goto函数)。
Goto函数g根据当前状态和输入符号决定迁移状态。例如,在0状态输入h会迁移到1状态,表示为g(0,h)=1;在状态3输入h会迁移到状态4,表示为g(3,h)=4。如果在某状态输入某个符号无法迁移成功,则意味着Goto函数失败,结果以fail表示,如在状态3输入e导致Goto函数失败,则表示为g(3,e)=fail。
Output函数表示在某状态匹配成功,可以输出的结果,如Output(2)=“he”。
为了构建Goto函数,要构建一个goto有向图。有向图以一个代表初始状态0的顶点开始,然后输入关键字到有向图中,添加一个从初始状态开始的路径。在添加路径的过程中,新的顶点和边被添加到了有向图中,所以从初始状态开始一条路径能拼出一个完整的关键字。这条路径在某个状态终止,这个状态被添加到了Output函数中。
假设{he,she,his,hers}是关键字集合,生成有限状态机的过程如图2所示:
添加第一个关键字“he”到有向图中,得到图2(a)所示。从状态0到状态2拼出关键字“he”;将输出“he”关联到状态2上,即Output(2)={he}。
将第二个关键字“she”添加到有向图中,得到图2(b)所示。将输出“she”关联到状态5,即Output(5)={she}。
将第三个关键字“his”添加到有向图中,得到如图2(c)所示。
需要注意的是,当添加关键字“his”时,已经有一个标记为h的边,从状态0到状态1,所以不需要再添加其他标记h的边从状态0到状态1。将输出“his”关联到状态7,即Output(7)={his}。
添加最后一个关键字“hers”,得到如图2(d)所示。输出“hers”关联到状态9,即Output(9)={hers}。在添加过程中,可以使用已经存在的标记h的边(从状态0到状态1)和标记e的边(从状态1到状态2)。
为了完成Goto函数的构建,还需要添加一个循环,该循环从状态0到状态0,对应于除了h和s外的其他输入符号。得到结果如图1(a)所示。
Failure函数(在算式中以f代表)表示在某个状态Goto函数失败时,应该跳转到哪一个状态继续进行匹配。如图1(b)所示,在状态5,当输入一个r符号时,g(5,r)=fail,就要调用f(5)=2处理,即先跳转到状态2,然后再调用g(2,r)处理。因为Failure函数代表着一个状态向另一个状态的迁移,相当于增加了一条链在两个状态之间,一般也可以将某状态Failure函数的指向称为本状态的Failure链。
Failure函数基于Goto函数构建。首先定义一个状态s在goto有向图中的深度,即从初始状态到s的最短路径的长度。在图1(a),初始状态的深度为0,状态1和3的深度为1,状态2、4、6的深度为2,依此类推。
计算一个状态的Failure函数f的算法如下:先计算所有深度为1的状态的Failure状态,然后是计算所有深度为2的状态的Failure状态,一直到所有状态的Failure状态都被计算,则本状态机的Failure函数构建完成。
置所有深度为1的状态的Failure状态为0,现在假设已经计算出了深度小于d的所有状态的Failure状态,则深度为d的状态s的Failure状态可以由深度为d-1状态的Goto函数的非fail值推导出来,具体过程如下:
首先,考虑深度为d-1的每个状态r并执行以下处理:
1.如果对所有的输入符号a,都是g(r,a)=fail,则结束状态r的处理。
2.否则,对每个输入符号a产生输出g(r,a)=s的情况,执行以下操作:
(a)设置状态变量state=f(r);
(b)执行算式state←f(state)(即将f(state)赋值给状态变量state)零到多次,直到state的值满足g(state,a)≠fail。(因为g(0,a)≠fail,所以适合的state值总能被发现);
(c)设置f(s)=g(state,a)。
例如,为了计算图1(a)中的Failure函数,应该首先设置f(1)=f(3)=0,因为1和3是深度为1的状态。然后计算深度2的状态2、4、6的Failure函数。
为了计算f(2),设置state=f(1)=0;因为g(0,e)=0,所以f(2)=0。
为了计算f(6),设置state=f(1)=0;因为g(0,i)=0,所以f(6)=0。
为了计算f(4),设置state=f(3)=0;因为g(0,h)=1,所以f(4)=1。
依照这种思路计算,就得到完整的Failure函数,如图1(b)所示。
在Failure函数的计算过程中,同时更新Output函数。当确定f(s)=s′,而状态s和s′同时是Output状态时,则将s′的输出集合并到s的输出集中。例如,从图1(a)中,可以确定f(5)=2。在这个点上,合并状态2的输出集{he}到状态5,从而得到新的输出集{he,she}。最终的Output函数如图1(c)所示。
下面举例进一步说明状态机的匹配过程。
以输入文本”sshe”进行搜索为例,当输入第一个s时,g(0,s)=3,所以迁移到状态3;输入第二个s,Goto函数失败,g(3,s)=fail,则调用Failure函数,f(3)=0表示跳转到状态0,然后g(0,s)=3,所以当前状态仍然是状态3;输入h,g(3,h)=4,迁移到状态4;输入e,g(4,e)=5,迁移到状态5;因为Output(5)={she,he},所以本次搜索发现了{she,he}两个用户预定义关键字。
在实现本发明的过程中,发明人发现,现有的Aho-Corasick算法至少存在以下问题:即有时Failure到某一状态后,Goto函数仍然失败,需要继续Failure跳转到其他状态,也就是说,现有的Aho-Corasick算法在Failure链处理方面效率低,存在很多低效的Failure链。
以图3所示的复杂状态机为例,其中虚线代表Failure链,q0表示初始状态。如在q14状态下,g(q14,e)=fail,只得根据f(q14)=q27跳转到状态q27;但是到了状态q27,同样是g(q27,e)=fail,只得跳转到f(q27)=q19;但仍然是g(q19,e)=fail,只得跳转到f(q19)=q0,即经历了g(q14,e)—>f(q14)—>g(q27,e)—>f(q27)—>g(q19,e)—>f(q19),才跳转到q0状态。
再参照图4所示的低效Failure链,f(q6)=q0,f(q5)=q4,f(q4)=q3,f(q3)=q2,f(q2)=q1,f(q1)=q0。如果在状态q4下输入符号c,g(q4,c)=fail,则按f(q4)=q3跳转到状态q3;但是仍然g(q3,c)=fail,则按照f(q3)=q2跳转到状态q2;但是仍然g(q2,c)=fail,则按照f(q2)=q1,跳转到状态q1;但是仍然g(q1,c)=fail,则按f(q1)=q0跳转到初始状态q0,至此才算Failure链跳转结束,即先后经过了g(q4,c)—>f(q3)—>g(q3,c)—>f(q2)—>g(q2,c)—>f(q1)—>g(q1,c)—>q0,才跳转到q0状态。
可见,Aho-Corasick算法在Failure链处理方面是相当低效率的,存在着很多低效的Failure链。
发明内容
本发明实施例提供一种建立模式匹配状态机的方法及装置,以减少模式匹配过程中低效的Failure链,提高模式匹配处理效率。
本发明实施例提供的一种建立模式匹配状态机的方法,包括:
获取预定义的关键字集合;
根据所述关键字集合生成迁移Goto函数;
根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;
根据Goto函数和Failure函数生成输出Output函数。
本发明实施例提供的一种建立模式匹配状态机的装置,包括:
获取单元,用于获取预定义的关键字集合;
Goto函数生成单元,用于根据所述关键字集合生成Goto函数;
Failure函数生成单元,用于根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入所述输入符号集内任意符号时,该状态的Goto函数不会失败;
Output函数生成单元,用于根据Goto函数和Failure函数生成Output函数。
由以上本发明实施例提供的技术方案可以看出,本发明实施例的建立模式匹配状态机的方法及装置,在构建Failure函数时,通过判断某状态的Failure状态的可接受输入集是否是本状态可接受输入集的子集,如果是,则不将该Failure状态作为本状态的Failure状态,而是继续寻找该Failure状态的Failure状态进行判断,直到找到一个适合的状态作为本状态的Failure状态,从而消除了依照现有技术建立的模式匹配状态机中低效的Failure链,提高了模式匹配的处理效率。
附图说明
图1是现有技术中根据关键字构建Goto、Failure、Output函数示意图;
图2是现有技术中有限状态机生成过程示意图;
图3是现有技术中的复杂状态机示意图;
图4是现有技术中的低效Failure链示意图;
图5是本发明实施例建立模式匹配状态机的方法的流程图;
图6是本发明实施例中生成Failure函数的流程图;
图7是根据本发明实施例的方法生成的对应于图4的Failure链示意图;
图8是本发明实施例建立模式匹配状态机的装置的原理框图。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。
参照图5,图5示出了本发明实施例建立模式匹配状态机的方法的流程,包括以下步骤:
步骤501,获取预定义的关键字集合;
步骤502,根据所述关键字集合生成Goto函数;
生成Goto函数的过程与现有技术相同,在此不再赘述;
步骤503,根据生成的Goto函数构建Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;
也就是说,在构建Failure函数时,如果f(s)=s′,但是状态s′的可接受输入集是状态s可接受输入集的子集,则状态s′不能作为状态s的Failure状态,应该继续寻找状态s′的Failure状态来做判断,直到找到一个适合的状态作为状态s的Failure状态;
在具体实现时,要判断s′的可接受输入集是否是s的可接受输入集的子集,只要看是否存在一个符号b,能使得g(s′,b)≠fail,但是g(s,b)=fail。如果存在符号b,则说明不是子集;否则说明是子集;
步骤504,根据Goto函数和Failure函数生成Output函数;
生成Goto函数的过程与现有技术相同,在此不再赘述。
在具体实现时,可以按照以下过程根据生成的Goto函数构建Failure函数:
先直接设置所有深度为1的状态的Failure状态为初始状态0,然后是根据深度为1的状态的Failure状态计算所有深度为2的状态的Failure状态,接着根据深度为2的状态的Failure状态计算深度为3状态的Failure状态,......,一直到所有状态的Failure状态都被计算(除了初始状态0的Failure状态没有定义),则Failure函数构建完成。
首先置所有深度为1的状态的Failure状态为0。现在假设已经计算出了深度小于d的所有状态的Failure状态,则深度为d的状态的Failure状态可以由深度为d-1状态的Goto函数的非fail值推导出来。
为了计算深度d的状态s的Failure函数,先考虑深度为d-1的每个状态r并执行以下动作:
1.如果对所有的输入符号a,都是g(r,a)=fail,则结束状态r的处理。
2.否则,对每个输入符号a产生输出g(r,a)=s的情况,执行以下操作:
(a)设置状态变量state=f(r);
(b)执行算式state←f(state)零到多次,直到state的值满足以下两个条件之一:
(i)s′=0(s′←g(state,a),0代表初始状态);
(ii)s′≠fail(因为g(0,a)≠fail,所以适合的state值总能被发现),并且存在一个输入符号b使得g(s′,b)≠fail和g(s,b)=fail(因为g(0,b)≠fail,所以适合的state值总能被发现);或者s′≠fail,state=0,则直接设置s′=0;
(c)设置f(s)=s′,即将s′作为深度d的状态s的Failure函数值。
通过上述步骤(b),可以保证s′的可接受输入集不是s的可接受输入集的子集,从而在构建Failure函数时避免了产生低效的Failure链。
下面以一个具体编程实现Failure函数的过程来说明,将状态集合以队列的方式来逐个计算各状态的Failure状态,通过图6所示流程来完成,主要包括以下步骤:
步骤601,定义一个状态集合queue,并将其清空。
步骤602,遍历输入符号集,所述输入符号集包含本模式匹配状态机可以使用的所有输入符号。该输入符号可以是包含单个字符的符号,也可以是包含多个字符的符号。为了便于清楚说明,本实施例以单个字符的符号为例。比如,对于输入符号集中的一个符号a,如果存在g(0,a)=s≠0,则将此状态放入状态集合queue中,并置状态s的Failure值为0。本步骤是一个循环的过程,通过遍历输入符号集,可以将深度为1的状态全部找出来,将它们全部放入状态集合queue中,并将它们的Failure状态都置为状态0。
步骤603,循环遍历状态集合queue。如果此时queue为空,则执行步骤614;否则执行步骤604。
步骤604,从状态集合queue中取出第一个状态处理,并将此状态从状态集合queue中删除,下面以取出状态r为例。
步骤605,遍历输入符号集来发现状态r的下联状态,如果输入符号集已经对状态r遍历完毕,则返回步骤603;否则执行步骤606。
步骤606,对于符号集中的一个符号a,如果存在g(r,a)=s≠fail,表明在状态机中r状态的下联状态为s,则将状态s放入状态集合queue中,用于后续处理状态s的下联状态;状态r的Failure状态在以前的处理中已经生成,用变量state来记录状态r的Failure状态。
步骤607,判断在状态state输入符号a时Goto函数是否为0;如果是,则执行步骤613;否则,执行步骤608。
步骤608,判断在状态state输入符号a时Goto函数是否失败。
因为f(s)=g(state,a),f(s)的值应该是一个有意义的状态,不能是fail,所以要预先判断g(state,a)是否为fail。如果是fail,即迁移失败,则执行步骤611;否则执行步骤609。
步骤609,判断状态s′的可接受输入集是否是状态s的可接受输入集的子集;如果是,则某符号在状态s下迁移失败,在状态s′下迁移也肯定失败,所以状态s′不能作为状态s的Failure状态,则执行步骤610;否则,执行步骤613。
上述s′=g(state,a),可以按照以下方式判断状态s′的可接受输入集是否是状态s的可接受输入集的子集:
遍历输入符号集,看是否存在一个符号b,使得g(g(state,a),b)≠fail,但是g(s,b)=fail。如果存在符号b,说明状态s′的可接受输入集不是状态s的可接受输入集的子集,否则说明子集存在。
步骤610,判断状态state是否为0;如果是,则执行步骤612;否则,执行步骤611。
步骤611,如果某一状态不能作为另一状态的Failure状态,应该跳转到这一状态的Failure状态继续尝试,即以state的Failure状态作为新的state状态来做尝试,然后返回步骤607继续进行判断。
步骤612,直接设置状态s的Failure状态为0,即f(s)=0;然后返回步骤605,搜索状态r下的其他下联状态。
步骤613,得出状态s的Failure状态,即f(s)←g(state,a);然后返回步骤605,搜索状态r下的其他下联状态。
步骤614,状态集合queue队列为空,表明本状态机所有状态已经处理完毕,Failure函数已经构建完成。
需要说明的是,在上述流程中,输入符号a、b表示输入符号集中的任意一个符号,而不特指其本身所表示的符号a、b。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质,如:ROM/RAM、磁碟、光盘等。
下面以图4所示的Failure链为例,对利用现有技术及本发明方法生成的Failure结果进行比较,进一步说明利用本发明方法减少低效的Failure链的效果。
计算结果如下表1所示:
 

步骤原有算法Failure结果本专利算法Failure结果1.置所有深度为1的状 态的Failure状态为初始状态      f(q1)=q0                           f(q1)=q0                           2.生成深度为2的状态 的Failure状态                  state=f(q1)=q0,   f(q2)=g(q0,a)=q1。                                                               state=f(q1)=q0,s′=g(state, a)=q1≠fail,因为q1和q2的可接    受输入集都是{a},所以不存在一      个b使得g(s′,b)≠fail和g(s,     b)=fail,而且state=f(q1)=q0所以直接设置s′=q0,得到f(q2)=q0。 3.生成深度为3的状态 的Failure状态        state=f(q2)=q1,   f(q3)=g(q1,a)=q2。                     state=f(q2)=q1,             不满足(i)、(ii)任意条件,所以执行state←f(state)=f(q1)=q0。 从步骤2可以看出因为q1满足      

 条件(ii),所以直接设置s′=0,得到f(q3)=s′=0。               4.生成深度为4的状态 的Failure状态        state=f(q3)=q2,   f(q4)=g(q2,a)=q3。                     state=f(q3)=q2,             不满足(i)、(ii)任意条件,所以执行state←f(state)=f(q2)=q1, 参考步骤3,得出f(q4)=q0。     5.生成深度为5的状态 的Failure状态        state=f(q4)=q3,   f(q5)=g(q3,a)=q4。                                          state=f(q4)=q3,                 s′=g(state,a)=q4≠fail,存在输入符号a使得g(q4,a)≠fail,但是       g(q5,a)=fail,满足条件(ii),所以  f(q5)=q4。                        6.生成深度为6的状态 的Failure状态                                                                    state=f(q5)=q4,          因为g(q4,b)=fail,所以执行 state=f(state)=f(q4)=q3。因为g(q3,b)=fail,所以执行 state=f(state)=f(q3)=q2。因为g(q2,b)=fail,所以执行 state=f(state)=f(q2)=q1。因为g(q1,b)=fail,所以执行 state=f(state)=f(q1)=q0。f(q6)=g(state,b)=g(q0,  b)=q0。                    state=f(q5)=q4,                因为g(q4,b)=fail,所以执行       state=f(state)=f(q4)=q3。      因为g(q3,b)=fail,所以执行       state=f(state)=f(q3)=q2。      因为g(q2,b)=fail,所以执行       state=f(state)=f(q2)=q1。      因为g(q1,b)=fail,所以执行       state=f(state)=f(q1)=q0。      f(q6)=g(state,b)=g(q0,b)=q0。

表1
最后,按照现有技术生成的Failure链如图4所示,对应于图4,按照本发明方法生成的Failure链如图7所示。
在上述实施例中,以单个字符的符号为例详细说明了实现Failure函数的过程,本发明实施例并不限于这种情况,同样可以适用于输入多个字符组成的符号的情况。
可见,利用本发明实施例的方法建立模式匹配状态机时,可以大大减少低效的Failure链,提高模式匹配处理效率。
本发明实施例还提供了一种建立模式匹配状态机的装置,如图8所示,该装置包括:获取单元81、Goto函数生成单元82、Failure函数生成单元83和Output函数生成单元84。其中,获取单元81用于获取预定义的关键字集合;Goto函数生成单元82用于根据所述关键字集合生成Goto函数;Failure函数生成单元83用于根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;Output函数生成单元84用于根据Goto函数和Failure函数生成Output函数。
如图8所示,在本发明的一种实施例中,Failure函数生成单元83包括:设置子单元831、状态获取子单元832和Failure状态生成子单元833。其中,设置子单元831用于设置所有深度为1的状态的Failure状态为初始状态;状态获取子单元832用于依次获取前一深度d-1的状态r的Failure状态作为当前状态state;Failure状态生成子单元833用于遍历输入符号集,判断在所述当前状态state输入所述输入符号时Goto函数是否失败,和所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集;并在所述当前状态state输入所述输入符号时Goto函数失败,或者所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是当前深度d的状态s的可接受输入集的子集时,将所述当前状态state的Failure状态作为新的所述当前状态继续上述判断;在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集时,将所述当前状态state输入所述输入符号时Goto函数值作为深度为d的状态s的Failure状态;在状态r输入所有的输入符号,Goto函数均为失败时,结束对状态r的处理。
Failure状态生成子单元833可以按照以下过程判断所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是否是状态s的可接受输入集的子集:
遍历输入符号集,如果存在满足以下条件的符号b:g(g(state,a),b)≠fail,并且g(s,b)=fail,其中a是在深度为d-1的状态r时的输入符号,则确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集不是状态s的可接受输入集的子集;否则,确定所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集。
如图8所示,在该实施例的建立模式匹配状态机的装置中,还可以包括第一判断单元85,用于判断所述当前状态state输入所述输入符号时Goto函数为0时,将所述当前状态state输入所述输入符号时的Goto函数值作为深度为d的状态s的Failure状态,除此之外,还可以包括第二判断单元86,用于判断在所述当前状态state输入所述输入符号时Goto函数不是失败,并且所述当前状态state输入所述输入符号时的Goto函数得到的迁移状态的可接受输入集是状态s的可接受输入集的子集,并且所述当前状态state为0时,直接设置深度为d的状态s的Failure状态为0。
利用本发明实施例的装置建立模式匹配状态机的具体过程与前面对本发明方法的描述类似,在此不再赘述。
利用本发明实施例的装置建立的模式匹配状态机,可以消除模式匹配状态机中低效的Failure链,提高模式匹配的处理效率。
以上对本发明实施例进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的装置及方法;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

建立模式匹配状态机的方法及装置.pdf_第1页
第1页 / 共23页
建立模式匹配状态机的方法及装置.pdf_第2页
第2页 / 共23页
建立模式匹配状态机的方法及装置.pdf_第3页
第3页 / 共23页
点击查看更多>>
资源描述

《建立模式匹配状态机的方法及装置.pdf》由会员分享,可在线阅读,更多相关《建立模式匹配状态机的方法及装置.pdf(23页珍藏版)》请在专利查询网上搜索。

本发明公开了一种建立模式匹配状态机的方法及装置,该方法包括:获取预定义的关键字集合;根据所述关键字集合生成迁移Goto函数;根据生成的Goto函数构建失败Failure函数,并使各状态的Failure状态的可接受输入集不是本状态的可接受输入集的子集,所述状态的可接受输入集表示在所述状态下输入本符号集合内任意符号时,该状态的Goto函数不会失败;根据Goto函数和Failure函数生成输出Outpu。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1