一种多模式字符串匹配方法和装置与流程

文档序号:12041803阅读:160来源:国知局
一种多模式字符串匹配方法和装置与流程
本发明涉及计算机技术领域,特别涉及一种多模式字符串匹配方法和装置。

背景技术:
在计算机领域,字符串匹配是比较常见的话题,比如在搜索操作、敏感词过滤等应用中,都会涉及到字符串匹配的问题。一个好的字符串匹配的方式,能够帮助应用减少CPU占用时间,提高应用的响应时间。多模式字符串匹配就是匹配的模式串不止一个,多模式串的匹配方法为:有n个模式串P1、P2、...、Pn和一个文本主串T,在T中寻找n个模式串中的任一个是否在T中出现,是则匹配成功。对于多模式串的匹配,现有方案的思路是按照单模式串进行匹配,然后遍历所有的模式串,直到匹配完成,即分别用各模式串与主串相匹配,判断是否有匹配成功的。假设单模式串的时间复杂度为O(m),模式串的个数为n,那么现有方案的多模式串匹配的时间复杂度则为nO(m)。由此可见,该类算法的时间复杂度会随着模式串个数的增加而线性增长,即使单模式的时间复杂度很低,但是当模式串的数量达到一定的量级后,该算法的CPU时间开销将十分可观。

技术实现要素:
本发明提供了一种多模式字符串匹配方法和装置,本发明的技术方案能够实现多模式字符串的精确匹配,同时该算法能大量降低CPU的时间开销,提高应用的响应速度。为达到上述目的,本发明的技术方案是这样实现的:本发明公开了一种多模式字符串匹配方法,该方法包括:将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构;将待匹配的主串沿所述决策树向下进行匹配。生成的所述决策树结构中,除了根节点外,其余的所有节点都写入有字符;生成的所述决策树结构中,起始的一个或多个字符相同的两个模式串的该相同字符对应写入同一节点。所述决策树中的每条路径对应一个或者多个模式串;所述决策树结构中的除根节点以外的每个节点还均包括:该节点对应的终止标志符;所述将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中还包括:如果一个模式串的最后一个字符对应的节点为非叶子节点,则设置其终止标志符有效,以标记该模式串的结束。所述将待匹配的主串沿所述决策树向下进行匹配包括:将待匹配的主串按字符顺序沿所述决策树逐节点向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果匹配到叶子节点或者匹配到终止标志符有效的非叶子节点,则匹配成功,将该路径上的从起始到该匹配到的叶子节点或者终止标志符有效的非叶子节点为止的字符作为匹配到的字符串输出。所述将待匹配的主串沿所述决策树向下进行匹配包括:将待匹配的主串按字符顺序沿所述决策树逐节点向下匹配时,每匹配到终止标志符有效的非叶子节点,则将该路径上的从起始到该终止标志符有效的非叶子节点为止的字符作为匹配到的字符串输出,并继续向下匹配,如果一直匹配到叶子节点,则将该整条路径上的字符作为匹配到的字符串输出。或者,该方法在生成决策树结构之前,进一步包括:在所述的多个模式串中,如果一个N字符的模式串与另一个模式串的首N个字符重合时,只保留前者,N为自然数;所述生成决策树结构包括:将保留下来的多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构;所述决策树中的每条路径仅对应一个模式串。所述将待匹配的主串沿所述决策树向下进行匹配包括:将待匹配的主串 按字符顺序沿所述决策树逐节点向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果匹配到叶子节点则匹配成功。所述决策树结构中,非叶子节点还包括其各子节点对应的哈希值;所述将待匹配的主串按字符沿所述决策树逐节点向下匹配的过程中,判断当前节点的子节点集合中是否包含与主串的当前字符匹配的子节点包括:计算主串当前字符的哈希值;将所述计算出的哈希值与各子节点对应的哈希值进行匹配,如果存在与主串当前字符的哈希值相匹配的哈希值,则确定当前节点的子节点集合中包含与主串的当前字符匹配的子节点,反之,则确定不包含。本发明还公开了一种多模式字符串匹配装置,该装置包括:创建模块,保存模块和匹配模块;创建模块,用于将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构,并将所述决策树结构保存到存储模块中;存储模块,用于保存决策树结构;匹配模块,用于将待匹配的主串沿存储模块中的决策树向下进行匹配。创建模块生成的所述决策树结构中,除了根节点外,其余的所有节点都写入有字符;创建模块生成的所述决策树结构中,起始的一个或多个字符相同的两个模式串的该相同字符对应写入同一节点。综上可见,本发明通过构建多模式字符串的决策树,然后用主串去匹配由多模式串构建的决策树,实现多模式字符串的精确匹配,该匹配方法与现有的将模式串逐个与主串进行匹配的方法相反,是将主串与由多模式串构成的决策树进行匹配,避免了大量的重复比较,提高了效率。该算法的时间开销取决于决策树的平均深度(即模式串的平均长度),而与模式串的数量无关。因此对于模式串较多的字符串匹配,该算法能大量降低CPU的时间开销,提高应用的响应速度。附图说明图1是本发明实施例中多模式字符串匹配方法的流程图;图2a是本发明实施例中的一个决策树的示意图;图2b是本发明实施例中的第二个决策树的示意图;图2c是本发明实施例中的第三个决策树的示意图;图3是本发明方案一中的构建多模式字符串匹配的决策树的流程图图4是本发明方案一中主串沿决策树匹配的流程图;图5是本发明方案二中的构建多模式字符串匹配的决策树的流程图;图6是本发明方案二中的主串沿决策树匹配的流程图;图7是本发明实施例中多模式字符串匹配装置的结构图。具体实施方式现有多模式串的主要问题在于,会进行大量的重复比较。比如模式串中有如下的字符串:“中华人民共和国”、“中国大使馆”、“中不中”、“新闻”、“新华日报”。由于其中三个模式串中的第一个字符都是“中”,所以在现有方案中,这个字符会被比较三次。因此本发明的整体思路为:为了避免这种重复的比较,首先将模式串进行整理和排序,生成一个决策树结构,从根节点出发向下遍历,每一条路径都是一个或多个模式串,然后将匹配方式反制,用主串去决策树结构上进行匹配。为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。图1是本发明实施例中多模式字符串匹配方法的流程图。如图1所示,该方法包括:101,将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构。所述决策树结构中的根节点包括:该根节点的子节点集合;所述决策树结构中的除根节点以外的每个节点均包括:该节点对应的字符和该节点是否为叶子节点的信息;当该节点是非叶子节点时,该节点还包 括:该节点的子节点集合。这里,一个节点的子节点是指该节点下的下一级节点,而不包括该节点下的下二级或以上的节点。本步骤生成的所述决策树结构中,除了根节点外,其余的所有节点都写入有字符;本步骤生成的所述决策树结构中,起始的一个或多个字符相同的两个模式串的该相同字符对应写入同一节点。这样,在决策树结构中这些起始相同的字符对应的路径重合。102,将待匹配的主串沿所述决策树向下进行匹配。也就是将主串从第一个字符开始沿着决策树向下匹配。本步骤中,将待匹配的主串按字符顺序沿所述决策树逐节点向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果一直匹配到叶子节点则匹配成功,所匹配到的模式串为由该条路径上的节点中的字符按顺序组成的字符串。本发明通过构建多模式字符串的决策树,将待匹配的主串沿所述决策树向下进行匹配能够实现多模式字符串的精确匹配。根据图1所示的方法,对于多模式串的一个例子:“中华人民共和国”、“中国人民解放军”、“中不中”、“新闻”、“新华日报”,可生成如图2a所示的决策树。图2a是本发明实施例中的一个决策树的示意图,如图2a所示的决策树中只示意出各个节点所对应的字符。参见图2a,在所生成的决策树结构中,除了根节点以外,其余的所有节点都有字符且每个节点一个字符。模式串“中华人民共和国”、“中国人民解放军”和“中不中”的首字符相同,都是“中”,因此这三个字符串的字符“中”对应的路径是重合的。同样,“新闻”和“新华日报”的首字符也相同,都为“新”,因此这两个字符串的字符“新”的路径重合,即对应同一个节点。很多时候,会出现一个N(N为自然数)字符的模式串与另一个模式串的首N个字符重合的情况:例如,存在模式串为“中国人民”和模式串“中国人民解放军”,即4字符的模式串“中国人民”与模式串“中国人民解放军”的首4个字符相同。此时按照图1所示的方法,“中国人民”和“中国人民解 放军”在决策树结构中在同一条路径上,当主串中有“中国人民”字符时不能被识别到,只有“中国人民解放军”能被识别,为解决该问题,本发明中给出了两种解决方案:方案一、在本发明的一个较佳的实施例中,设置终止标志符,具体来说:所述决策树结构中的除根节点以外的每个节点还可以均包括:该节点对应的终止标志符;上述步骤101中的将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中还包括:如果一个模式串的最后一个字符对应的节点为非叶子节点,则设置其终止标志符有效,以标记该模式串的结束;上述步骤102中,将待匹配的主串按字符顺序沿所述决策树逐节点向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果匹配到叶子节点或者匹配到终止标志符有效的非叶子节点,则匹配成功,将该路径上的从起始到该匹配到的叶子节点或者终止标志符有效的非叶子节点为止的字符作为匹配到的字符串输出。这种方案下,决策树上的一条路径对应一个或者多个模式串。进一步地,如果匹配到终止标志符有效的非叶子节点,则匹配成功之后,还继续沿所述决策树向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果一直匹配到叶子节点,则匹配成功,将该整条路径上的字符作为匹配到的字符串输出。也就是说,将待匹配的主串按字符沿所述决策树逐节点向下匹配时,每匹配到终止标志符有效的非叶子节点,则将该路径上的从起始到该终止标志符有效的非叶子节点为止的字符作为匹配到的字符串输出,并继续向下匹配,如果一直匹配到叶子节点,则将该整条路径上的字符作为匹配到的字符串输出。例如,构成图2a所示的决策树的模式串为:中华人民共和国”、“中国人民解放军”、“中不中”、“新闻”、“新华日报”,在此基础上,又增加了模式串“中国人民”,这里,“中国人民”与“中国人民解放军”的首4个字符重合,则此时的决策树结构如图2b所示。图2b是本发明实施例中的第二个决策树的示意图。如图2b所示,模式串“中国人民解放军”的路径覆盖了“中国人民”的路径,为了能够识别模 式串“中国人民”,在其最后一个字符“民”对应的非叶子节点中设置终止标志符有效(图2b中用“终止”示意)。则将待匹配的主串按字符沿所述决策树逐节点向下匹配,如果匹配到叶子节点或者匹配到终止标志符有效的非叶子节点,则匹配成功。再举例主串为“中国人民团结一致....”,则沿图2b所示的决策树逐节点向下匹配,则首先匹配到“中”节点,然后在“中”节点的多个子节点中匹配到“国”节点,在“国”节点的子节点中匹配到“人”节点,再在“人”节点的子节点中匹配到“民”节点,该“民”节点中设置终止有效,则匹配成功,匹配到的模式串为“中国人民”。如果实际应用需要,则可以继续向下进行匹配,每匹配到终止标志符有效的非叶子节点,则将该路径上的从起始到该终止标志符有效的非叶子节点为止的字符作为匹配到的字符串输出,并继续向下匹配,如果一直匹配到叶子节点,则将该整条路径上的字符作为匹配到的字符串输出。方案二、在本发明的另一个较佳实施例中,精减模式串,即在所述的多个模式串中,如果一个N字符的模式串与另一个模式串的首N个字符重合时,只保留前者,N为自然数,然后用保留下来的(即精减后剩下的)多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构。这种方案下,决策树中的每条路径仅对应一个模式串。将待匹配的主串沿所述决策树向下进行匹配为:将待匹配的主串按字符顺序沿所述决策树逐节点向下匹配,如果当前字符与当前节点写入的字符不一致,则结束流程;如果匹配到叶子节点则匹配成功。仍以上述的多个模式串为例,该多个模式串为:“中华人民共和国”、“中国人民解放军”、“中不中”、“中国人民”、“新闻”和“新华日报”。其中“中国人民”与“中国人民解放军”的首4个字符重合,保留前者,则“中国人民解放军”被精简掉,剩下的模式串为:“中华人民共和国”、“中不中”、“中国人民”、“新闻”和“新华日报”,由这些剩下的模式串构成的决策树如图2c所示。图2c是本发明实施例中的第三个决策树的示意图。如图2c所示,在方 案二中所生成的决策树,由于预先进行了精简,因此不需要设置终止符号。在实际应用中,如果需要将主串中存在的所有模式串都找出来,则此时不适合采用方案二,而适合采用方案一。下面对方案一和方案二的具体实现方式进一步进行详细描述。方案一的具体实现图3是本发明方案一中的构建多模式字符串匹配的决策树的流程图,如图3所示具体包括以下步骤:步骤301,构建根节点及根节点的子节点集合;步骤302,判断所述多个模式串中是否存在未被添入决策树的的模式串,是则将一个未被添入决策树的模式串设置为当前模式串,执行303,否则结束流程;步骤303,设置当前模式串的首位字符为当前字符,设置根节点为当前节点,所述当前节点的子节点集合为当前集合;本流程中所述的“当前”相当于编程技术中的“指针”,用于表示当前的处理对象。例如,当前模式串为“中国人民”则,其首字符“中”为当前字符。步骤304,判断当前集合中是否包含所述当前字符,是则执行步骤305;否则执行步骤308;例如,本步骤中当前集合为根节点的子集合,当前字符为“中”,则判断根节点是否已存在与“中”字对应的子节点。步骤305,判断当前字符是否为当前模式串的最后一个字符,是则执行步骤306,否则执行步骤307;本步骤中是判断是否到了当前要添入的模式串的结尾,是则说明当前模式串的路径在原决策树结构中已存在。例如“中国人民解放军”已添入决策树时,当前要添入的模式串为“中国人民”,且当前字符为“民”的情况。步骤306,设置当前字符对应的节点中的终止标志符有效,以指示匹配 终止,执行步骤302;例如,本步骤中,在“中国人民”的“民”字符对应的节点中设置终止标志符有效。步骤307,设置当前字符对应的节点为当前节点,所述当前字符对应的节点的子节点集合为当前集合,当前模式串的当前字符的下一个字符为当前字符,执行步骤304;步骤308,判断当前字符是否为最后一个字符,是则执行步骤309,否则执行步骤310;步骤309,在当前节点下创建当前字符对应的叶子节点,并将当前字符添加到所述当前集合中,设置当前字符对应的节点中的终止标志符有效,以指示匹配终止,执行步骤302;本步骤中是将当前模式串的最后一个字符添入了决策树结构中,当前模式串的处理结束,返回302去处理下一个模式串。步骤310,在当前节点下创建当前字符对应的非叶子节点,并将当前字符作添加到所述当前集合中,并构建所创建的非叶子节点的子节点集合,设置所述当前字符对应的节点中的终止标志符无效,以指示匹配不终止,设置所创建的非叶子节点的子节点集合为当前集合,设置当前模式串的下一个字符为当前字符,执行步骤304。本步骤中是将当前模式串的一个字符添入了决策树结构中,且当前模式串还未结束,后续仍有待添入的字符,因此各个指针分别向下移动一位,返回执行304所述的步骤。通过上述的步骤301~310,可以将多个模式串全部添入决策树中,最后得到一个由该多个模式串构成的决策树结构。图4是本发明方案一中主串沿决策树匹配的流程图,如图4所示,将主串沿所述决策树向下进行匹配具体步骤包括:步骤401,设置主串的首位字符为当前字符;步骤402,设置根节点为当前节点,且所述根节点的子节点集合为当前集合;步骤403,判断所述当前字符是否为空,是则结束流程,否则进执行步 骤404;步骤404,判断当前集合中是否包含与所述当前字符匹配的子节点,是则执行步骤405,否则执行步骤410;步骤405,设置所述子节点为当前节点,所述子节点的子节点集合为当前集合;步骤406,判断当前节点是否为叶子节点,是则匹配成功,执行步骤408,否则执行步骤407;步骤407,判断当前节点中的终止标志符是否有效,是则匹配成功,执行步骤408,否则执行步骤409;步骤408,匹配成功,输出匹配到的模式串,执行步骤409;步骤409,设置所述当前字符的下一个字符为当前字符,执行步骤403;步骤410,去除主串的首位字符得到新主串,设置该新主串的首位字符为当前字符,执行步骤402。例如,决策树如图2b所示,主串为“中国人民解放了”,按图4所示的流程匹配如下:1.设置主串的首字符“中”为当前字符(步骤401);2.设置决策树(图2b所示)的根节点为当前节点,根节点的子节点集合为当前集合(步骤402);3.当前字符为“中”,不为空,当前集合中包含与“中”对应的节点,设置“中”节点为当前节点以及设置“中”节点的子节点集合为当前集合;“中”节点不为叶子节点,且终止标志符无效,设置“国”为当前字符(步骤403-404-405-406-407-409);4.当前字符为“国”,不为空,当前集合中包含与“国”对应的节点,设置“国”节点为当前节点以及设置“国”节点的子节点集合为当前集合;“国”节点不为叶子节点,且终止标志符无效,设置“人”为当前字符(步骤403-404-405-406-407-409);5.当前字符为“人”,不为空,当前集合中包含与“人”对应的节点,设置“人”节点为当前节点以及设置“人”节点的子节点集合为当前集合;“人” 节点不为叶子节点,且终止标志符无效,设置“民”为当前字符(步骤403-404-405-406-407-409);6.当前字符为“民”,不为空,当前集合中包含与“民”对应的节点,设置“民”节点为当前节点以及设置“民”节点的子节点集合为当前集合;“民”节点不为叶子节点,但其终止标志符有效,匹配成功(步骤403-406-407-411-412-匹配成功);输出匹配成功的模式串“中国人民”。7.设置“解”为当前字符(步骤409);8.当前字符为“解”,不为空,当前集合中包含与“解”对应的节点,设置“解”节点为当前节点以及设置“解”节点的子节点集合为当前集合;“解”节点不为叶子节点,且终止标志符无效,设置“放”为当前字符(步骤403-404-405-406-407-409);9.当前字符为“放”,不为空,当前集合中包含与“放”对应的节点,设置“放”节点为当前节点以及设置“放”节点的子节点集合为当前集合;“放”节点不为叶子节点,且终止标志符无效,设置“了”为当前字符(步骤403-404-405-406-407-409);10.当前字符为“了”,不为空,当前集合中不包含与“了”对应的节点,去除主串的首字符得到新的主串“国人民解放了”,设置该新主串的首字符“国”为当前字符,设置根节点为当前节点,根节点的子节点集合为当前集合进行新一轮的匹配(步骤403-404-410-402),这里不在复述。下面给出方案二下的具体实现情况。方案二的具体实现缩减模式串的范围后,在构建决策树的过程中,无需再进行终止标志符的设置。图5是本发明方案二中的构建多模式字符串匹配的决策树的流程图,如图5所示具体包括以下步骤:步骤501,构建根节点及根节点的子节点集合;步骤502,判断所述多个模式串中是否存在未添入决策树的模式串,是则将一个未添入决策树的模式串设置当前模式串,执行503,否则结束流程;步骤503,设置当前模式串的首位字符为当前字符,设置根节点为当前节点,所述当前节点的子节点集合为当前集合;步骤504,判断当前集合中是否包含所述当前字符,是则执行步骤505;否则执行步骤507;步骤505,判断当前字符是否为当前模式串的最后一个字符,是则执行步骤502,否则执行步骤506,步骤506,设置当前字符对应的节点为当前节点,所述当前字符对应的节点的子节点集合为当前集合,当前模式串的下一个字符为当前字符,执行步骤504;步骤507,判断当前字符是否为最后一个字符,是则执行步骤508,否则执行步骤509;步骤508,在当前节点下创建当前字符对应的叶子节点,并将当前字符添加到所述当前集合中,执行步骤502;步骤509,在当前节点下创建当前字符对应的非叶子节点,并将当前字符作添加到所述当前集合中,并构建所创建的非叶子节点的子节点集合,设置所创建的非叶子节点的子节点集合为当前集合,设置当前模式串的下一个字符为当前字符,执行步骤504。由于预先对多模式串进行了精简处理,因此图5所示的决策树构建流程,与图3所示的决策树构建流程相比,省略了设置终止标志符的过程。图6是本发明方案二中的主串沿决策树匹配的流程图,如图6所示,此时将待匹配的主串沿所述决策树向下进行匹配包括:步骤601,设置主串的首位字符为当前字符;步骤602,设置根节点为当前节点,且所述根节点的子节点集合为当前集合;步骤603,判断所述当前字符是否为空,是则结束流程,否则执行步骤604;步骤604,判断当前集合中是否包含与所述当前字符匹配的子节点,是则执行步骤605,否则执行步骤609;步骤605,设置所述子节点为当前节点,所述子节点的子节点集合为当 前集合,并执行步骤606;步骤606,判断当前节点是否为叶子节点,是则匹配成功执行步骤607,否则执行608;步骤607,匹配成功,输出匹配到的模式串,执行608;步骤608,设置所述当前字符的下一个字符为当前字符,执行步骤603。步骤609,去除主串的首位字符得到新主串,设置该新主串的首位字符为当前字符,执行步骤602。图6所示的匹配流程与图4所示的匹配流程相比,只是省略了关于终止标志符的判断,其他相同,这里不在复述。另外,当模式串的数量增加时,决策树的宽度会增加,本发明中对决策树子节点的查找使用哈希算法,具体来说:决策树结构中的非叶子节点还包括各子节点对应的哈希值;匹配流程中,判断当前集合中是否包含与主串的当前字符匹配的子节点包括:计算主串当前字符的哈希值;将所述计算出的哈希值与各子节点对应的哈希值进行匹配,如果存在与主串当前字符的哈希值相匹配的哈希值,则确定当前集合中包含与主串的当前字符匹配的子节点,反之,则确定不包含。这种对于决策树的子节点的查找使用哈希算法的方案,使得决策树的宽度改变并不会影响字符串匹配的CPU时间开销,所以该算法的时间开销只取决于决策树的平均深度,与模式串的数量无关。对于模式串较多的字符串匹配,该算法能大量降低CPU的时间开销,提高应用的响应速度。图7是本发明实施例中多模式字符串匹配装置的结构图,如图7所示,该装置包括:创建模块701,保存模块702和匹配模块703;创建模块701,用于将多个模式串,按其各自的字符组成顺序,沿树结构的根节点向下,将每个字符写入一个节点中,生成一个决策树结构,并将所述决策树结构保存到存储模块702中;存储模块702,用于保存决策树结构;所述决策树结构中的根节点包括:该根节点的子节点集合;所述决策树结构中的除根节点以外的每个节点均包括:该节点对应的字符和该节点是否为叶子节点的信息;当该节点是非叶子节点时,该节点还包括:该节点的子节点集合;匹配模块703,用于将待匹配的主串沿存储某块702中的决策树向下进行匹配。创建模块701生成的所述决策树结构中,除了根节点外,其余的所有节点都写入有字符;创建模块701生成的所述决策树结构中,起始的一个或多个字符相同的两个模式串的该相同字符对应写入同一节点。在一种情况下:所述决策树结构中的除根节点以外的每个节点均包括:该节点对应的终止标志符;所述创建模块,用于通过执行下述步骤来根据被匹配的多个模式串生成一个决策树结构:a1,构建根节点及根节点的子节点集合;a2,判断所述多个模式串中是否存在未被添入决策树的模式串,是则将一个未被添入决策树的模式串设置当前模式串,否则结束流程;a3,设置当前模式串的首位字符为当前字符,设置根节点为当前节点,所述当前节点的子节点集合为当前集合;a4,判断当前集合中是否包含所述当前字符,是则执行a5;否则执行a8;a5,判断当前字符是否为当前模式串的最后一个字符,是则执行a6,否则执行a7;a6,设置当前字符对应的节点中的终止标志符有效,以指示匹配终止,进入a2;a7,设置当前字符对应的节点为当前节点,所述当前字符对应的节点的子节点集合为当前集合,当前模式串的当前字符的下一个字符为当前字符,执行a4;a8,判断当前字符是否为最后一个字符,是则执行a9,否则执行a10;a9,在当前节点下创建当前字符对应的叶子节点,并将当前字符添加到所述当前集合中,设置所述当前字符对应的节点中的终止标志符有效,以指示匹配终止,执行a2;a10,在当前节点下创建当前字符对应的非叶子节点,并将当前字符作添加到所述当前集合中,并构建所创建的非叶子节点的子节点集合,设置所述当前字符对应的节点中的终止标志符无效,以指示匹配不终止,设置所创建的非叶子节点的子节点集合为当前集合,设置当前模式串的下一个字符为当前字符,执行a4。所述匹配模块,用于通过执行以下步骤将待匹配的主串沿决策树向下进行匹配:b1,设置主串的首位字符为当前字符;b2,设置根节点为当前节点,且所述根节点的子节点集合为当前集合;b3,判断所述当前字符是否为空,是则结束流程,否则执行b4;b4,判断当前集合中是否包含与所述当前字符匹配的子节点,是则执行b5,否则执行b10;b5,设置所述子节点为当前节点,所述子节点的子节点集合为当前集合,并执行b11;b6,判断当前节点是否为叶子节点,是则匹配成功,执行b8,否则执行b7;b7,判断当前节点中的终止标志符是否有效,是则匹配成功,执行b8,否则执行b9;b8,步骤408,匹配成功,输出匹配到的模式串,执行b9;b9,设置所述当前字符的下一个字符为当前字符,执行b3。b10,去除该主串的首位字符得到新主串,设置该新主串的首位字符为当前字符,执行b2。在另一种情况下:所述创建模块,在根据被匹配的多个模式串生成一个决策树结构之前,进一步用于对多个模式串进行精减,即在所述的多个模式串中,如果一个N字符的模式串与另一个模式串的首N个字符重合时,只保留前者,N为自然 数;所述创建模块,用于通过执行下述步骤来根据被精简后剩下的多个模式串生成一个决策树结构:A1,构建根节点及根节点的子节点集合;A2,判断所述多个模式串中是否存在未被添入决策树的模式串,是则将一个未被添入决策树的模式串设置当前模式串,执行A3,否则结束流程;A3,设置当前模式串的首位字符为当前字符,设置根节点为当前节点,所述当前节点的子节点集合为当前集合;A4,判断当前集合中是否包含所述当前字符,是则执行A5;否则执行A7;A5,判断当前字符是否为当前模式串的最后一个字符,是则执行A2,否则执行A6,A6,设置当前字符对应的节点为当前节点,所述当前字符对应的节点的子节点集合为当前集合,当前模式串的下一个字符为当前字符,执行步骤A4;A7,判断当前字符是否为最后一个字符,是则执行A8,否则执行A9;A8,在当前节点下创建当前字符对应的叶子节点,并将当前字符添加到所述当前集合中,执行A2;A9,在当前节点下创建当前字符对应的非叶子节点,并将当前字符作添加到所述当前集合中,并构建所创建的非叶子节点的子节点集合,设置所创建的非叶子节点的子节点集合为当前集合,设置当前模式串的下一个字符为当前字符,执行A4;所述匹配模块,用于通过执行以下步骤将待匹配的主串沿决策树向下进行匹配:步骤B1,设置主串的首位字符为当前字符;步骤B2,设置根节点为当前节点,且所述根节点的子节点集合为当前集合;步骤B3,判断所述当前字符是否为空,是则结束流程,否则执行步骤B4;步骤B4,判断当前集合中是否包含与所述当前字符匹配的子节点,是则 执行步骤B5,否则执行步骤B9;步骤B5,设置所述子节点为当前节点,所述子节点的子节点集合为当前集合,并执行步骤B6;步骤B6,判断当前节点是否为叶子节点,是则匹配成功执行步骤B7,否则执行B8;步骤B7,匹配成功,输出匹配到的模式串,执行B8;步骤B8,设置所述当前字符的下一个字符为当前字符,执行步骤B3。步骤B9,去除主串的首位字符得到新主串,设置该新主串的首位字符为当前字符,执行步骤B2。在上述装置中,决策树结构中的非叶子节点还包括:各子节点对应的哈希值;则,匹配模块703,用于计算主串当前字符的哈希值,将所述计算出的哈希值与各子节点对应的哈希值进行匹配,如果存在与主串当前字符的哈希值相匹配的哈希值,则确定当前集合中包含与主串的当前字符匹配的子节点,反之,则确定不包含,以判断当前集合中是否包含与主串的当前字符匹配的子节点。综上所述本发明通过构建多模式字符串的决策树能够实现多模式字符串的精确匹配,同时根据子节点对应的哈希值查找该子节点,决策树的宽度改变并不会影响字符串匹配的CPU时间开销,所以该算法的时间开销只取决于决策树的平均深度,与模式串的数量无关。对于模式串较多的字符串匹配,该算法能大量降低CPU的时间开销,提高应用的响应速度。以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1