一种文本查找的方法和装置制造方法

文档序号:6545850阅读:232来源:国知局
一种文本查找的方法和装置制造方法【专利摘要】本发明提供一种文本快速查找的方法和装置,包括:优化数据存储结构,建立有限状态自动机,存储每个状态的单链表;存储扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,i≥0且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表Vi的状态域,对所述线性表Li进行二分查找;完成文本的匹配和查找。本发明加快了下一状态的跳转速度,既降低了AC算法的空间复杂度,减少了内存消耗,又提高了算法的效率。【专利说明】一种文本查找的方法和装置【
技术领域
】[0001]本发明涉及计算机【
技术领域
】,尤其涉及一种文本查找的方法和装置。【
背景技术
】[0002]对于文件检查,主要是对文本中出现的关键字段进行快速匹配查找并定位相应文件。通常计算机里存储有数以万计各类型的文本文件,为了快速准确地查找关键字段需要应用一些模式匹配算法。对于入侵检测系统,模式匹配算法通常应用于误用检测,著名的开放源码的入侵检测系统Snort就是基于模式匹配。模式匹配算法的性能直接影响入侵检测系统的检测效率。在高速网络环境下,如果模式匹配算法来不及处理大量的实时网络数据包,必然会丢弃部分数据包,而这些被丢弃的数据包中就可能包含入侵信息。常用的模式匹配算法有BF算法、KMP算法、BM算法、BMH算法、AC算法等。由于AC算法的简单高效,所以它的应用范围比较广。[0003]AC算法是一种经典的多模式匹配算法。对于给定的长度为η的文本,和模式集合P{pl,p2,...pm},在0(η)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关,即能快速有效的在指定文本中查找匹配特定的关键字符或字段。AC算法使用的数据结构是Trie树,是一种用于快速查找的多叉树结构。其核心思想是以空间换时间,利用字符串的公共前缀来减少查询时间以提高效率,主要采用完全Hash表方式来存储跳转状态。但是,如果当系统中存在大量字段且这些字段也都没有公共前缀的话,那么相应的Trie树就会非常耗费内存。这在中文文本查找来说尤为明显,对于英文目标字符串的字符数最大是256,但对于中文文本来说,匹配的目标字符串最大数目到达256*256,随着目标字符串增大,Trie树结构也随之增大,存储空间急剧膨胀,巨大的存储空间会使得AC算法的时效性大大降低。【
发明内容】[0004](一)要解决的技术问题[0005]本发明提供一种文本查找的方法和装置,以解决现有技术中AC算法的存储空间过大,时效性较低的技术问题。[0006](二)技术方案[0007]为解决上述技术问题,本发明提供一种文本查找的方法,包括:[0008]建立有限状态自动机,存储每个状态的单链表;[0009]存储扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,I^O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;[0010]计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表Vi的状态域,对所述线性表Li进行二分查找;[0011]完成文本的匹配和查找。[0012]进一步地,所述存储每个状态的单链表还包括:[0013]建立顶点表,记录所述单链表的表头地址,形成邻接链表。[0014]进一步地,所述计算所述有限状态自动机的跳转函数还包括:[0015]若当前状态不在所述单链表Vi的状态域中时,直接搜索当前状态后的单链表。[0016]进一步地,所述完成文本的匹配和查找包括:[0017]根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。[0018]另一方面,本发明还提供一种文本查找装置,包括顺序相连的存储单元、转化单元、计算单元和查找单元,其中:[0019]存储单元,用于存储有限状态自动机中每个状态的单链表;[0020]转化单元,用于存储有限状态自动机中扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,I^O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;[0021]计算单元,用于计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表\的状态域,对所述线性表Li进行二分查找;[0022]查找单元,用于完成文本的匹配和查找。[0023]进一步地,所述存储单元还用于:[0024]建立顶点表,记录所述单链表的表头地址,形成邻接链表。[0025]进一步地,所述计算单元还用于:[0026]若当前状态不在所述单链表Vi的状态域中时,直接搜索当前状态后的单链表。[0027]进一步地,所述查找单元还用于:[0028]根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。[0029](三)有益效果[0030]可见,在本发明实施例提供的一种文本查找方法和装置中,将有限状态自动机中扇出系数大于指定阈值的单链表转化为线性表,替代了原本的完全Hash表存储方式,加快了下一状态的跳转速度,既降低了AC算法的空间复杂度,减少了内存消耗,又提高了算法的效率。【专利附图】【附图说明】[0031]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。[0032]图1是本发明实施例文本查找方法的基本流程示意图;[0033]图2是本发明实施例文本查找方法的一个优选流程示意图;[0034]图3是本发明实施例Trie多叉树结构图;[0035]图4是本发明实施例邻接链表存储方式示意图;[0036]图5是本发明实施例文本查找方法改进的邻接链表存储方式示意图;[0037]图6是完全Hash表和本发明实施例邻接链表空间存储对比结果示意图;[0038]图7是本发明实施例文本查找装置的基本结构示意图。【具体实施方式】[0039]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0040]本发明实施例首先提供一种文本查找方法,参见图1,包括:[0041]步骤101:建立有限状态自动机,存储每个状态的单链表;[0042]步骤102:存储扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,i>O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;[0043]步骤103:计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表Vi的状态域,对所述线性表Li进行二分查找;[0044]步骤104:完成文本的匹配和查找。[0045]可见,在本发明实施例提供的一种文本查找方法中,将有限状态自动机中扇出系数大于指定阈值的单链表转化为线性表,替代了原本的完全Hash表存储方式,加快了下一状态的跳转速度,既降低了AC算法的空间复杂度,减少了内存消耗,又提高了算法的效率。[0046]优选地,存储每个状态的单链表还可以包括:建立顶点表,记录所述单链表的表头地址,形成邻接链表。[0047]优选地,可以将扇出系数较大的单链表转化为线性表[0048]优选地,计算所述有限状态自动机的跳转函数还可以包括:若当前状态不在所述单链表Vi的状态域中时,直接搜索当前状态后的单链表。[0049]优选地,完成文本的匹配和查找可以包括:根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。[0050]下面以基于中文文本的快速查找方法为例,来详细说明本发明一个实施例的具体实现过程,参见图2:[0051]步骤201:建立有限状态自动机,存储每个状态的单链表。[0052]本步骤中,首先建立有限状态自动机,其中需要建立顶点表,statetable,用于记录单链表表头地址。对于模式串集K中的每一个模式串ki;初始状态为状态O。逐个取出模式串中的每一个字符,搜索statetable[0]后面的单链表,若存在文本域为该字符的节点,则将节点的状态域的值i作为当前状态,并跳转到statetable[i];否则添加一个新节点,新节点的状态域为已有的最大状态加1,文本域为当前读入的模式串的字符,继续对模式串中的下一个字符进行处理。[0053]其中,上述邻接链表的存储方式具体为:为Trie多叉树结构中每个状态Si建立一个单链表Vi,Vi中的节点表示可以从状态Si跳转的状态。节点有三个域组成:字符域、状态域、链域。其中字符域存储从状态Si出发跳转到其他状态时所经过的字符,状态域存储从状态Si出发经过字符域中字符跳转的状态,链域存储从状态Si出发可以跳转到另一节点的地址。此外,设置一个顶点表,记录各个单链表的表头地址,形成一个邻接链表,例如:对如图3的Trie多叉树结构,其邻接链表存储方式如图4所示。[0054]步骤202:存储扇出系数大于指定阈值的单链表Vi的字符域和状态域,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序。[0055]本步骤中,可以设置一个扇出系数的阈值,在本发明实施例中,仅将状态为O的单链表转化为线性表,其中,首先定义一个线性表,将单链表中的字符域和状态域存储在该线性表中,对其字符域排序,释放状态O的单链表的存储空间。[0056]对于当前状态Si,对应单链表Vi,如果模式串字符之间的独立性不高(如英文单词,仅26个字母),各状态的扇出系数平均分布,即各状态对应的单链表长度相当,搜索效率较高。若模式串字符之间的独立性较高(如中文,常用的汉字有3500个),则某些状态(如状态O)的扇出系数较大,而其他状态的扇出系数较小,搜索扇出系数高的单链表将花费大量的时间。设模式串集K={a0,a1;a2,...,ak}?极端情况下,aj=S1…!=ak,则状态0的扇出系数为k。当k较大时,后续计算跳转函数gotoO的时间开销较大。[0057]因此,对中文模式集,本发明实施例将状态O的单链表Vtl转化为线性表Lci,即保留字符域和状态域,去掉链域,释放单链表Vtl的存储空间,并对线性表Ltl的字符域进行排序。例如,模式串集={升职,时尚白领,中国,外企,生存},则存储方式如图5。[0058]步骤203:计算有限状态自动机的跳转函数、失效函数和输出函数。[0059]其中,在计算gotoO跳转函数时,如果当前状态为0,则对线性表Ltl二分查找;否则搜索对应状态单链表。本发明实施例计算跳转函数的方法在不增加额外的存储空间前提下,减少了跳转函数的计算时间,提高了算法的效率。[0060]计算失效函数fail()。父状态为O的状态的失效函数为O。对其他状态m,若其父状态为r,则失效函数fail(m)=goto(fail(r),a),其中函数gotoO为跳转函数,a为文本中的字符。[0061]计算输出函数outputO分为两步:一是构造Trie多叉树的过程中,每处理完一个模式串,将该模式串加入到当前状态s的输出函数中;二是若fail(s)=s’,则output(s)=output(S)Uoutput(S,)。[0062]步骤204:根据文本的当前状态,利用跳转函数、失效函数和输出函数完成文本的匹配和查找。[0063]具体步骤为:[0064]步骤S1:将当前状态s初始化为0,文本串指针指向文本串的头。[0065]步骤S2:如文本串指针不为空,则取出所指的字符“a”;否则匹配过程结束。[0066]步骤S3:调用跳转函数gotoO,计算S,=goto(s,a)。若s=O,则二分查线性表L0,否则直接搜索状态s对应的单链表。[0067]步骤S4:如果s’==fail,则调用failO函数,即当前状态s=fail(S)。如果s!=O,转至步骤S3;[0068]步骤S4:若s’!=fail,则s=s’。若output(s)=NULL,转到步骤S2。[0069]至此,则完成了本发明实施例基于中文文本的快速查找方法的全过程。[0070]本发明实施例的方法与原先的AC算法相比,改进算法在空间复杂度有较大提升。完全Hash表方式存储的Trie多叉树结构,对于中文模式串,每一次所需的存储空间为256*256,算法的空间复杂度为0(n*65536),其中η为状态数。而带跳转距离的邻接链表有η个节点(不包括顶点),每个节点所需的空间为1,顶点表所需的存储空间为2η,算法的空间复杂度为0(2η+η*1)=O(3η),故带跳转距离的邻接链表方式的空间性能优于完全Hash表方式。图6为完全Hash表和邻接链表空间性能的对比结果。[0071]完全Hash表存储方式所需的存储空间较大,且随着模式串数量的增加,所需存储空间近似呈几何增加。当模式串数目大于1500时,完全Hash表存储方式所需内存超出了系统所能分配的最大内存。邻接链表存储方式的空间性能最优,其存储空间不超过完全Hash表的10%。[0072]本发明实施例还提供一种文本查找装置,参见图7,包括:[0073]存储单元701,用于存储有限状态自动机中每个状态的单链表;[0074]转化单元702,用于存储有限状态自动机中扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,i^O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;[0075]计算单元703,用于计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表\的状态域,对所述线性表Li进行二分查找;[0076]查找单元704,用于完成文本的匹配和查找。[0077]优选地,存储单元701还可以用于:建立顶点表,记录所述单链表的表头地址,形成邻接链表。[0078]优选地,计算单元703还可以用于:若当前状态不在所述单链表Vi的状态域中时,直接搜索当前状态后的单链表。[0079]优选地,查找单元704还可以用于:根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。[0080]可见,本发明实施例至少具有如下有益效果:[0081]在本发明实施例提供的一种文本查找方法和装置中,将有限状态自动机中扇出系数大于指定阈值的单链表转化为线性表,替代了原本的完全Hash表存储方式,加快了下一状态的跳转速度,既降低了AC算法的空间复杂度,减少了内存消耗,又提高了算法的效率。[0082]最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。【权利要求】1.一种文本查找的方法,其特征在于,包括:建立有限状态自动机,存储每个状态的单链表;存储扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,I^O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表Vi的状态域,对所述线性表Li进行二分查找;完成文本的匹配和查找。2.根据权利要求1所述的文本查找方法,其特征在于,所述存储每个状态的单链表还包括:建立顶点表,记录所述单链表的表头地址,形成邻接链表。3.根据权利要求1所述的文本查找方法,其特征在于,所述计算所述有限状态自动机的跳转函数还包括:若当前状态不在所述单链表Vi的状态域中时,直接搜索当前状态后的单链表。4.根据权利要求1至3中任一项所述的文本查找方法,其特征在于,所述完成文本的匹配和查找包括:根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。5.一种文本查找装置,其特征在于,包括顺序相连的存储单元、转化单元、计算单元和查找单元,其中:存储单元,用于存储有限状态自动机中每个状态的单链表;转化单元,用于存储有限状态自动机中扇出系数大于指定阈值的单链表Vi的字符域和状态域,其中i为单链表节点状态域的值,i^O且取整数,将其转化为线性表Li且释放所述单链表Vi的存储空间,对所述线性表Li的字符域进行排序;计算单元,用于计算所述有限状态自动机的跳转函数、失效函数和输出函数,其中,计算所述跳转函数时,若当前状态等于所述单链表Vi的状态域,对所述线性表Li进行二分查找;查找单元,用于完成文本的匹配和查找。6.根据权利要求5所述的文本查找装置,其特征在于,所述存储单元还用于:建立顶点表,记录所述单链表的表头地址,形成邻接链表。7.根据权利要求5所述的文本查找装置,其特征在于,所述计算单元还用于:若当前状态不在所述单链表\的状态域中时,直接搜索当前状态后的单链表。8.根据权利要求5至7中任一项所述的文本查找装置,其特征在于,所述查找单元还用于:根据所述文本的当前状态,利用所述跳转函数、失效函数和输出函数完成文本的匹配和查找。【文档编号】G06F17/30GK104008136SQ201410191247【公开日】2014年8月27日申请日期:2014年5月7日优先权日:2014年5月7日【发明者】刘超,姜建国,李敏,仇新梁,喻民,胡波,黄超,王菲飞,王冉晴,赵双,刘坤颖,夏剑锋申请人:中国科学院信息工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1