一种多字符串匹配方法

文档序号:6606312阅读:214来源:国知局
专利名称:一种多字符串匹配方法
技术领域
本发明涉及一种多字符串匹配方法,属于字符串匹配技术领域。
背景技术
在计算机领域,字符串匹配一直是计算机领域研究的焦点之一。字符串匹配问题 可以描述为已知需要匹配的t(t为正整数)个子串(通常称之为模式串,或规则),用P1, P2,…,P1表示,需要检索的字符串(通常称之为文本),用Τ[ρ··η](η为正整数)表示,查 找在文本T[L···!!]中所有出现的模式串,并报告其出现的位置。所谓多模式匹配,就是在文 本串T[L···!!]中一次匹配多个模式串P1, P2,-,P^t = 1时,多模式匹配蜕化为单模式匹 配。字符串匹配在拼写检查、语言翻译搜索引擎等应用中起着关键的作用;同时,字符 串匹配也是众多信息内容安全系统中的关键技术之一。其中,多字符串匹配的方法目前已 经广泛用于网络信息过滤,入侵检测系统和生物信息计算的基因序列比较等实际应用中。这些应用的共同特点有以下两个方面一是需要处理大量的数据(人类基因组共 有30多亿个碱基对;2009年6月,中国网络国际出口带宽达到747541Mbps) ;二是需要匹配 的关键词条目多(以基因序列为例,关键词条目达到0(104)的数量级)。随着网络以及生 物学的发展,对多字符串匹配方法的处理能力提出了更高的要求。在传统的多字符串匹配方法中,Wu. Sun和Udi. Manber在文献《A Fast Algorithm for Multi-Pattern Searching))中提出的Wu-Manber方法,采用了跳跃不可能匹配的字符 策略和HASH散列的方法,加速匹配的进行,在许多相关领域中得到了应用。Wu-Manber方法包括一个预处理阶段和一个扫描阶段。在预处理阶段,首先计算模式串集合P中最短的模式串长度,记为m。然后,对所有 模式串(仅考虑前m个字符组成的模式串)构建哈希表(记为HASH)、跳转表(记为SHIFT) 和前缀表(记为PREFIX)。HASH表的每个表项指向最后B(B为正整数,其值根据实验情况择 优选择)个字符被哈希到该表项的模式串,如果有多个模式串被哈希到同一表项,则采用 链式存储结构存储;SHIFT表用于在扫描文本串的时候,根据读入字符串决定可以跳过的 字符数,其最大值为(m-B+1),其最大值也成为跳越窗口的宽度;PREFIX表存储的是每个模 式串前B' (B'为正整数,其值根据实验情况择优选择)个字符的哈希值。此处,建立HASH 表和PREFIX表所用到的哈希函数根据不同情况进行选择。在扫描阶段,按如下步骤进行第1步设一指针q,指向文本T的第m个字符;第2步从当前指针往前的B-I个字符开始,向后扫描B个字符,使用预处理阶段 建立HASH表所用到的哈希函数,计算该B个字符的哈希值h ;第3步查SHIFT表,找到SHIFT [h]如果大于0,则将指针q向后移动SHIFT [h] 个长度,转到第2步;否则转到第4步;第4步从当前指针往前的m-1个字符开始,向后扫描B'个字符,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h';第5步查HASH表,找到HASH[h]的指针,遍历链表。对链表中的每个模式串,如 果它在PREFIX表的值与前缀哈希值h'相等,则将文本串和模式串逐一字符进行比较,判 断是否完全匹配。如完全匹配,则报告完全匹配位置q ;否则,不报告;第6步判断指针q是否指向文本串的结束符,如指向结束符,则结束过程;否则, 将指针q向后移动一个字符,转到第2步。经过分析与实际运用,发现WU-MANBER方法存在以下不足SHIFT表中表项的大小是影响匹配过程中窗口跳跃距离的关键。在传统的 Wu-Manber方法中SHFIT表项中的最大值,同待匹配规则集的最短字符串长度有关,为 (m-B+1)。在实际应用中,有时候规则集中只有少数几个字符串为短字符串,其中绝大多数 为长字符串。由于少数的短字符串的存在,使得SHIFT表中的值大大减少。这样在匹配的 过程中,窗口的跳跃距离也大大减少。在这种情况下,Wu-Manber方法的性能受到极大影响。 特别是长字符串的平均长度远大于少数几个短字符串的平均长度时。例如有一个规则集, 其中字符串的最短长度为100,在对该规则集运用WU-MANBER方法进行匹配的时候,SHIFT 表项中的最大值为(100-B+1)。若往该规则集中加入的少量的短字符串,这些短字符的最短 长度为6,构造成一个新的规则集。根据Wu-Manber方法匹配过程,SHIFT表项中的最大值 为(6-B+1)。若对新的规则集使用Wu-Manber方法进行文本的匹配,由于SHIFT表项中的最 大值将由原来(100-B+1)迅速减小到(6-B+1),匹配过程中窗口的平均跳跃距离将大大减 少,Wu-Manber方法的快速性将受到影响。

发明内容
本发明的目的是克服已有技术存在的不足,提出一种多字符串匹配方法。一种多字符串匹配方法,包括一个预处理阶段和一个扫描阶段。预处理阶段包括构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤 表HOT,其具体工作步骤如下第1步设置HOT表的大小SUM以及HOT表选取的字符块的长度s ;其中,SUM彡256 并且SUM为正整数;s = 2或3。第2步将模式串集合P中的全部模式串分为长模式串和短模式串两类,长模式串 集合记为P1,短模式串集合记为P2,短模式串的数量记为SumP2 ;具体为第a步确定跳越窗口的宽度与最短模式串长度的比值r,r为正整数,其取值范围 满足公式1。2<r <lmax/lmin (1)其中,Imax为模式串集合P中最长的模式串的长度;Imin为模式串集合P中最短 的模式串长度。第b步根据公式2、公式3确定分类标准M值M = rXlmin-(r-l) X s (2)第c步当模式串的长度大于M时,则判断其为长模式串;否则,判断其为短模式 串;
第d步判断当前的短模式串的数量SumP2是否满足SumP2S 1. 5 X SUM,如果满足,
执行第3步;否则,减小r值,并确保r满足2 < r < ^,然后返回到第b步。
/min第3步对于全部长模式串的前M个字符组成的字符串StringL以及全部短模式 串的前Imin个字符组成的字符串StringS进行操作,构建哈希表HASH、跳转表SHIFT、前缀 表PREFIX和短模式串过滤表HOT ;具体为①HASH表HASH表的每个表项指向所述字符串StringL或StringS最后B (B为 正整数,其值根据实际情况确定)个字符被哈希到该表项的模式串,如果有多个模式串被 哈希到同一表项,则采用链式存储结构存储。②PREFIX表存储所述字符串StringL或StringS前B' (B'为正整数,其值根 据实际情况确定)个字符的哈希值。③HOT表依次对短字符串集合P2中的所有模式串作如下操作第a步将指针指向其起始位置,向后取长度为s的字符块,计算其哈希值为h_ hot,将 H0T[h_hot]设置为 1 ;第b步将指针后移一位;判断指针与该字符串的结束标识符之间的距离是否为 (s-1),如果不是,执行第a步;否则,结束操作;经过上述步骤的操作,即可完成HOT表的构建。④SHIFT 表首先,将SHIFT表中的所有项赋值为M-B+1 ;然后,对长模式串集合P1中的模式串依次做如下处理第a步将指针指向该模式串的第M个字符,并用qi(qi为正整数)表示当前指针 指向字符串中的位置,qi的初始值为Μ;第b步向前取长度为B的字符块,计算其哈希值为h_shift_l,将SHIFT[h_ shift_l]的值设置为M-qi ;第c步将指针向前移动一个字符,并为坫赋值为qi-Ι ;判断距离该模式串的起 始字符的距离是否小于B-1,如果不是,回到第b步;否则,结束操作。再对短模式串集合P2中的模式串依次做如下处理第a步将指针指向该模式串的第Imin个字符,并用qj (qj为正整数)表示当前 指针指向字符串中的位置,Qj的初始值为Imin ;第b步向前取长度为B的字符块,计算其哈希值为h_shift_s,将SHIFT[h_ shift_s]的值设置为 lmin-qj ;第c步将指针向前移动一个字符,并为qj赋值为qj-Ι ;判断距离该模式串的起 始字符的距离是否小于B-1,如果不是,回到第b步;否则,结束操作。经过上述步骤的操作,即可完成SHIFT表的构建。所述HASH表、PREFIX、SHIFT表和HOT表在建立时所用到的哈希函数根据不同情 况进行选择。在扫描阶段,按如下步骤进行第1步设一指针q_text,指向文本T的第M个字符;第2步从当前指针往前的B-I个字符开始,向后扫描B个字符,使用预处理阶段建立HASH表所用到的哈希函数,计算该B个字符的哈希值h ;第3步查SHIFT表,找到SHIFT[h];如果SHIFT[h]等于0,执行第4步;否则,跳 转到第7步;第4步从当前指针往前的M-I个字符开始,向后扫描B'个字符,使用预处理阶 段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h_long ;从当前指针 往前的Imin-I个字符开始,向后扫描B'个字符,使用预处理阶段建立PREFIX表所用到的 哈希函数,计算这B'个字符的前缀哈希值h_short ;第5步查HASH表,找到HASH[h]的指针,遍历链表。对链表中的每个模式串,如 果它在PREFIX表的值与相应的前缀哈希值(对于长模式串,为h_long,对于短模式串,为 h.short)相等,则将文本T和模式串逐一字符进行比较(对于长模式串,匹配的起始位置 为当前指针位置往前M-I个字符处;对于短模式串,匹配的起始位置为当前指针位置往前 Imin-I个字符处),判断是否完全匹配。如完全匹配,则报告完全匹配位置;否则,不报告;第6步将指针q_text向后移动一个字符,转到第8步。第7步若SHIFT [h]不大于(lmin-B+1),则将指针向后移动SHIFT [h]个距离;否 则,进行如下操作第a 步设置 r' =1,第b步从当前指针所在位置往后((r' +1) X (lmin-s)-(B-l))个字符的位置处 向前取长度为s的字符串;计算其哈希值hash_h,判断“H0T[hash_h] = 0”是否成立;若成 立,执行第c步;否则,跳转到第d步;第c 步判断“(r' +1) Xlmin-(r' ) X s_(B_l) < SHIFT[h] ”是否成立,若成立, 将r'取值为(r' +1),返回到第b步;否则,将指针向后移动SHIFT[h]个字符的距离;第d步令dis = ((r' +1) Xlmin-r*s-(B-l)),并将指针向后移动dis个字符的距离。第8步判断指是否指向文本T的结束符,如指向结束符,则结束;否则, 转到第2步。经过上述步骤的操作,即可完成多个模式串的匹配。有益效果本发明的一种多字符串匹配方法与已有技术比较,具有以下优点本发明结合了 原有Wu-Manber方法的窗口跳跃的优点,克服了其最大跳跃距离受到规则集中最短字符串 长度限止的不足。通过引入HOT表,利用匹配过程中查找HOT的方法,使得窗口的最大跳跃 距离得到增大的同时不会遗漏短字符串。本发明方法具有更高的匹配效率。
具体实施例方式下面结合附图
和具体实施例对本发明方案进行详细说明。实施例中,待匹配的模式串集合P中有3个模式串,分别为“english”、 "kilometer","fine",对应长度为7、9、4,其编号分别为0,1,2。其文本T的内容为 "vmogenglishsdyfine ”;使用本发明提出的方法在文本T中搜索模式串“ engl ish”、 “kilometer”、“fine”的具体过程如下预处理阶段包括构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT,其具体工作步骤如下第1步设置HOT表的大小SUM以及HOT表选取的字符块的长度s ;将SUM设置为 256,取 s = 2。第2步将模式串集合P中的全部模式串分为长模式串和短模式串两类,长模式串 集合记为P1,短模式串集合记为P2,短模式串的数量记为SumP2 ;具体为第a步确定跳越窗口的宽度与最短模式串长度的比值r,在本例中Imax = 9, Imin = 4,由公式1可得r = 2。第b步根据公式2、公式3确定分类标准M值:M = 2X4-(2-1) X2 = 6。第c步当模式串的长度大于6时,则判断其为长模式串;否则,判断其为短模式 串;因此将“englisWkilometer”归入长模式串集合;“fine”归入短模式串集合。该 过程结束后,将原有模式串集合划分为长模式串集合与短模式串集合;长模式串集合包括 "english","kilometer";短模式串集合包括“fine”。第d步判断当前的短模式串的数量SumP2是否满足SumP2 ( RX SUM,此时取R = 50%,由于 SumP2 = 1,RXSUM = 50% X256 = 128,满足 SumP2 彡 RXSUM,执行第 3 步。第3步对于全部长模式串的前6个长度的字符进行截取,对短模式串的前4个字 符进行截取,得到StringL与StringS的集合,如表1所示。表IStringL 与 StringS 集合 根据StringL与StringS,构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模 式串过滤表HOT ;首先选定构造时所用到的哈希函数,对于HASH表,PREFIX表,以及SHIFT表的构 造,均选用哈希函数hashl ;对于HOT表,选用哈希函数hash2 ;两个函数的定义如下unsigned int hashl(char氺str){unsigned int hash_value = 0 ;while (*str ! = NULL) {hash_value << = 6 ;hash_value+ =氺str++ ;}return hash_value & 0x2fffT ;}unsigned int hash2(char氺str){unsigned int hash_value = 0 ;while (*str ! = NULL) {hash_value <<= 6 ;
将HASH表、SHIFT表的大小选取为0x2ffff,PREFIX表的大小为规则集中模式串 的数目3,HOT表的大小如前文中所示,用16进制表示为OxfT。具体构造过程为①HASH表选取B = 2,对于StringL集合中的“englis”,选取“is”,计算哈希值 为6835,将“english”添加至HASH[6835]中;在“kilome”的末尾,选取“me”,计算其哈希 值为7077,将“kilometer”添加至HASH[7077]中;对于StringS集合中的“fine”,选取末 尾“ne”,计算其哈希值,假定为7141,将“fine”添加至HASH[7141]中。HASH表如表2所
7J\ ο表2本发明方法得到的HASH表
哈希值683570777141对应模式串NULLenglishNULLkilometerNULLfineNULL②PREFIX表选取B' = 2,对于StringL集合中的“englis”的起始,选取“en”,计 算哈希值为6574,将PREFIX表中“englis”的对应项PREFIX
赋值为6574 ;在“kilome” 的起始,选取“ki”,计算其哈希值为6953,将PREFIX表中“kilome”的对应项PREFIX[1]赋 值为6953 ;对于StringS集合中的“fine”,在起始处选取“fi ”,计算其哈希值为6633,将 PREFIX表中“fine”的对应项PREFIX[2]赋值为6633。PREFIX表如表3所示。表3本发明方法得到的PREFIX表
规则编号012PREFIX657469536633③HOT表设定构建HOT表的字符块长度为s = 2,HOT表的大小为256,并将HOT 表中的值均初始化为0。对于短模式串集合中的“fine”,首先将指针指向其起始位置,向后 选取长度为2的字符块“fi”,计算其哈希值为233,则令HOT [233] = 1 ;将指针往后移动一 位,向后选取长度为2的字符块“in”,计算其哈希值为174,令HOT[174] = 1 ;将指针往后 移动一位,向后选取长度为2的字符块“ne”,计算其哈希值为229,则令HOT [229] = 1 ;至 此,fine中任意长度为2字符块均进行了 HOT表的填写处理,对“fine”的处理结束。对短 模式集合P2中的所有模式串,进行相同的处理。本例中,P2中仅有一个模式串,HOT表的构 造结束。HOT表如表4所示。表4本发明方法得到的HOT表
10 ④SHIFT 表首先,将SHIFT表中的所有项赋值为M-B+1,此时有M = 6,B = 2,即SHIFT表中的 所有项初始化为5 ;然后,对长模式串集合P1中的模式串进行处理。对于“english”,将指针指向该模式串的第6个字符“S”,此时当前指针的位置为 Qi = 6。向前取长度为2的字符块“is”,计算其哈希值为6835,将SHIFT[6835]的值设置 为M-qi = 0 ;将指针向前移动一个字符,将qi赋值为qi-Ι = 5,此时向前取字符块“ Ii ”, 计算其哈希值为7017,将SHIFT[7017]的值设置为M_qi = 1 ;将指针继续向前移动一个字 符,将qi赋值为qi-Ι = 4,此时向前取字符块“gl”,计算其哈希值为6700,将SHIFT[6700] 的值设置为M-qi = 2 ;继续按照该方法填写SHFTT表,直至指针移至距离模式串起始距离 为2,此时qi = 2,向前取字符块“en”,计算其哈希值为6574,将SHIFT [6574]的值设置为 M-qi =4。再将指针向前移动一个字符,则有qi = 1,此时距离该模式串的起始字符的距离 为qi-丨=0小于B-I = 1。至此,对“english”的处理结束。对长模式串集合P1中的另一 模式串“kilome”采用相同的方法处理,直至处理完P1中所有模式串。再对短模式串集合P2中的模式串进行处理。对于“fine”,将指针指向该模式串的第4个字符“e”,此时当前指针的位置为qj =6。向前取长度为2的字符块“ne”,计算其哈希值为7141,将SHIFT[7141]的值设置为 lmin-qj = 0 ;将指针向前移动一个字符,将qj赋值为qj_l = 3,此时向前取字符块“in”, 计算其哈希值为6830,将SHIFT [6830]的值设置为lmin-qj = 1 ;将指针继续向前移动一个 字符,将qj赋值为qj-Ι = 2,向前取字符块“fi”,计算其哈希值为6633,将SHIFT [6633]的 值设置为lmin-qj = 2。再将指针向前移动一个字符,则有qj = 1,此时距离该模式串的起 始字符的距离为qj-1 =0小于B-I = 1。至此,对“fine”的处理结束。由于P2中仅含有 模式串“fine”,对P2的处理也结束。从而得到构建好的SHIFT表,如表5所示。表5本发明方法得到的SHIFT表 下面对文本T进行扫描,寻找模式串,详细过程如下第1步设一指针q_text,指向文本T的第6个字符“η”。第2步从当前指针往前的1个字符开始,向后取长度为2的字符块“en”,使用预 处理阶段建立HASH表所用到的哈希函数,计算其哈希值为6574。第3步根据该哈希值,查找SHIFT表,可得SHIFT [6574] = 4 ;转到第7步。第7步若SHIFT[h]大于3,需要查找HOT表。取r' =1,在文本T中距离当 前指针位置(第6个字符)往后3个字符(第9个字符)处,向前读取长度为s = 2的 字符块“li”,计算其哈希值并查找HOT表,由于HOT表中相应项为0,将r'增大为2,判 断(r' +1) X Imin-(r' ) X s-(B_l) < 4是否成立,不成立,因此,可将指针向后移动 SHIFT[6574] = 4个距离,此时指针指向文本T中第10个字符。第8步判断指针q_text未指向文本T的结束符,转到第2步。第2步从当前指针往前的1个字符开始,向后取长度为2的字符块“is”,使用预 处理阶段建立HASH表所用到的哈希函数,计算其哈希值为6835。第3步根据该哈希值,查找SHIFT表,可得SHIFT [6574] = 0 ;执行第4步。第4步从当前指针往前的M-I = 5个字符开始,向后扫描B' = 2个字符,使用 预处理阶段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h_long = 6574;从当前指针往前的Imin-I = 3个字符开始,向后扫描B' =2个字符,使用预处理阶 段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h_short = 6700 ;第5步查HASH表,找到HASH[6835]所对应的模式串为“english”,将其在PREFIX 表中的值“6574”与h_long对比,发现相等。因此,将文本与模式串“english”逐一比较, 发现完全匹配。于是,报告“english”在文本中的位置。此时,指针q_text指向第11个字 符)第6步将指针q_text向后移动一个字符(第12个字符),转到第8步。第8步判断指针q_text未指向文本T的结束符,转到第2步。第2步从当前指针往前的1个字符开始,向后取长度为2的字符块“hs”,使用预 处理阶段建立HASH表所用到的哈希函数,计算其哈希值为6771。第3步根据该哈希值,查找SHIFT表,可得SHIFT[6771] = 5 ;转到第7步。第7步若SHIFT[h]大于3,需要查找HOT表。取r' =1,在文本T中距离当 前指针位置(第12个字符)往后3个字符(第15个字符)处,向前读取长度为s = 2 的字符块“yf ”,计算其哈希值并查找HOT表,由于HOT表中相应项为0,将r ‘增大为2, 判断(r' +1) X Imin-(r' ) X s_(B_l) < 5是否成立,不成立,因此,可将指针向后移动 SHIFT[6574] = 5个距离,此时指针指向文本T中第17个字符。第8步判断指针q_text未指向文本T的结束符,转到第2步。第2步从当前指针往前的1个字符开始,向后取长度为2的字符块“in”,使用预 处理阶段建立HASH表所用到的哈希函数,计算其哈希值为6830。
第3步根据该哈希值,查找SHIFT表,可得SHIFT [6830] = 1 ;执行第7步。第7步若SHIFT[h]不大于3,则将指针向后移动1个距离,此时,指针指向文本T 中第18个字符。第8步判断指针q_text未指向文本T的结束符,转到第2步。第2步从当前指针往前的1个字符开始,向后取长度为2的字符块“ne”,使用预 处理阶段建立HASH表所用到的哈希函数,计算其哈希值为7141。第3步根据该哈希值,查找SHIFT表,可得SHIFT[7141] = 0;执行第4步。第4步从当前指针往前的M-I = 5个字符开始,向后扫描B' = 2个字符“dy”, 使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h_long =6521 ;从当前指针往前的Imin-I = 3个字符开始,向后扫描B' = 2个字符“fi”,使用 预处理阶段建立PREFIX表所用到的哈希函数,计算这B'个字符的前缀哈希值h_short = 6633 ;第5步查HASH表,找到HASH[7141]所对应的模式串为“fine”,将其在PREFIX表 中的值“6633”与1!_吐0汁对比,发现相等。因此,将文本与模式串“fine”逐一比较,发现 完全匹配。于是,报告“fine”在文本中的位置。此时,指针q_text指向第18个字符)第6步将指针q_text向后移动一个字符(第19个字符),转到第8步。第8步判断指针q_text指向文本T的结束符,结束操作。为说明本发明的效果,使用原始WU-MANBER方法对本实施例中的数据进行操作, 得到SHIFT表如6所示表6原始WU-MANBER方法得到的SHIFT表 通过两种方法的比较,可以看出本发明方法将原始的WU-MANBER方法中的最大 跳跃距离Imin-I = 3扩大至M-B+1 = 5,使得在匹配的过程中能够跳跃更远的距离,减少跳 跃的次数,从而提高匹配的效率。实际上,根据模式串集合构造的SHFIT表中值的平均大小 能够反映匹配过程中跳跃的平均长度。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人 员来说,在不脱离本发明原理的前提下,还可以做出若干改进,或者对其中部分技术特征进 行等同替换,这些改进和替换也应视为本发明的保护范围。
权利要求
一种多字符串匹配方法,其特征在于包括一个预处理阶段和一个扫描阶段;预处理阶段包括构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT,其具体工作步骤如下第1步设置HOT表的大小SUM以及HOT表选取的字符块的长度s;其中,SUM≥256并且SUM为正整数;s=2或3;第2步将模式串集合P中的全部模式串分为长模式串和短模式串两类,长模式串集合记为P1,短模式串集合记为P2,短模式串的数量记为SumP2;具体为第a步确定跳越窗口的宽度与最短模式串长度的比值r,r为正整数,其取值范围满足公式1; <mrow><mn>2</mn><mo>&le;</mo><mi>r</mi><mo>&le;</mo><mfrac> <mrow><mi>l</mi><mi>max</mi> </mrow> <mrow><mi>l</mi><mi>min</mi> </mrow></mfrac><mo>-</mo><mo>-</mo><mo>-</mo><mrow> <mo>(</mo> <mn>1</mn> <mo>)</mo></mrow> </mrow>其中,lmax为模式串集合P中最长的模式串的长度;lmin为模式串集合P中最短的模式串长度;第b步根据公式2、公式3确定分类标准M值M=r×lmin (r 1)×s(2)第c步当模式串的长度大于M时,则判断其为长模式串;否则,判断其为短模式串;第d步判断当前的短模式串的数量SumP2是否满足SumP2≤1.5×SUM,如果满足,执行第3步;否则,减小r值,并确保r满足然后返回到第b步;第3步对于全部长模式串的前M个字符组成的字符串StringL以及全部短模式串的前lmin个字符组成的字符串StringS进行操作,构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT;具体为①HASH表HASH表的每个表项指向所述字符串StringL或StringS最后B个字符被哈希到该表项的模式串,如果有多个模式串被哈希到同一表项,则采用链式存储结构存储;其中,B为正整数,其值根据实际情况确定;②PREFIX表存储所述字符串StringL或StringS前B′个字符的哈希值;其中,B′为正整数,其值根据实际情况确定;③HOT表依次对短字符串集合P2中的所有模式串作如下操作第a步将指针指向其起始位置,向后取长度为s的字符块,计算其哈希值为h_hot,将HOT[h_hot]设置为1;第b步将指针后移一位;判断指针与该字符串的结束标识符之间的距离是否为(s 1),如果不是,执行第a步;否则,结束操作;经过上述步骤的操作,即可完成HOT表的构建;④SHIFT表首先,将SHIFT表中的所有项赋值为M B+1;然后,对长模式串集合P1中的模式串依次做如下处理第a步将指针指向该模式串的第M个字符,并用qi表示当前指针指向字符串中的位置,qi为正整数,qi的初始值为M;第b步向前取长度为B的字符块,计算其哈希值为h_shift_l,将SHIFT[h_shift_l]的值设置为M qi;第c步将指针向前移动一个字符,并为qi赋值为qi 1;判断距离该模式串的起始字符的距离是否小于B 1,如果不是,回到第b步;否则,结束操作;再对短模式串集合P2中的模式串依次做如下处理第a步将指针指向该模式串的第lmin个字符,并用qj表示当前指针指向字符串中的位置,qj为正整数,qj的初始值为lmin;第b步向前取长度为B的字符块,计算其哈希值为h_shift_s,将SHIFT[h_shift_s]的值设置为lmin qj;第c步将指针向前移动一个字符,并为qj赋值为qj 1;判断距离该模式串的起始字符的距离是否小于B 1,如果不是,回到第b步;否则,结束操作;经过上述步骤的操作,即可完成SHIFT表的构建;所述HASH表、PREFIX、SHIFT表和HOT表在建立时所用到的哈希函数根据不同情况进行选择;在扫描阶段,按如下步骤进行第1步设一指针q_text,指向文本T的第M个字符;第2步从当前指针往前的B 1个字符开始,向后扫描B个字符,使用预处理阶段建立HASH表所用到的哈希函数,计算该B个字符的哈希值h;第3步查SHIFT表,找到SHIFT[h];如果SHIFT[h]等于0,执行第4步;否则,跳转到第7步;第4步从当前指针往前的M 1个字符开始,向后扫描B′个字符,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B′个字符的前缀哈希值h_long;从当前指针往前的lmin 1个字符开始,向后扫描B′个字符,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B′个字符的前缀哈希值h_short;第5步查HASH表,找到HASH[h]的指针,遍历链表;对链表中的每个模式串,如果它在PREFIX表的值与相应的前缀哈希值相等,则将文本T和模式串逐一字符进行比较;判断是否完全匹配;如完全匹配,则报告完全匹配位置;否则,不报告;对于长模式串,匹配的起始位置为当前指针位置往前M 1个字符处;对于短模式串,匹配的起始位置为当前指针位置往前lmin 1个字符处;第6步将指针q_text向后移动一个字符,转到第8步;第7步若SHIFT[h]不大于(lmin B+1),则将指针向后移动SHIFT[h]个距离;否则,进行如下操作第a步设置r′=1,第b步从当前指针所在位置往后((r′+1)×(lmin s) (B 1))个字符的位置处向前取长度为s的字符串;计算其哈希值hash_h,判断“HOT[hash_h]=0”是否成立;若成立,执行第c步;否则,跳转到第d步;第c步判断“(r′+1)×lmin (r′)×s (B 1)<SHIFT[h]”是否成立,若成立,将r′取值为(r′+1),返回到第b步;否则,将指针向后移动SHIFT[h]个字符的距离;第d步令dis=((r′+1)×lmin r*s (B 1)),并将指针向后移动dis个字符的距离;第8步判断指针q_text是否指向文本T的结束符,如指向结束符,则结束;否则,转到第2步;经过上述步骤的操作,即可完成多个模式串的匹配。FSA00000199047500012.tif
全文摘要
本发明涉及一种多字符串匹配方法,属于字符串匹配技术领域。本发明基于传统的Wu-Manber方法,对规则集中的长字符串和短字符串进行了分离,在建SHIFT表时,对规则集中的长字符串和短字符串采取不同的处理方式,从而使得SHIFT表的最大表项不受到短字符串长度的限制,克服了其最大跳跃距离受到规则集中最短字符串长度限制的不足;通过引入HOT表,利用匹配过程中查找HOT的方法,使得窗口的最大跳跃距离得到增大的同时不会遗漏短字符串。本发明方法具有更高的匹配效率。
文档编号G06F17/30GK101901257SQ20101023246
公开日2010年12月1日 申请日期2010年7月21日 优先权日2010年7月21日
发明者嵩天, 黎达 申请人:北京理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1