CN101901257A - 一种多字符串匹配方法 - Google Patents

一种多字符串匹配方法 Download PDF

Info

Publication number
CN101901257A
CN101901257A CN 201010232463 CN201010232463A CN101901257A CN 101901257 A CN101901257 A CN 101901257A CN 201010232463 CN201010232463 CN 201010232463 CN 201010232463 A CN201010232463 A CN 201010232463A CN 101901257 A CN101901257 A CN 101901257A
Authority
CN
China
Prior art keywords
character
string
shift
hash
pattern string
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN 201010232463
Other languages
English (en)
Other versions
CN101901257B (zh
Inventor
嵩天
黎达
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Institute of Technology BIT
Original Assignee
Beijing Institute of Technology BIT
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Institute of Technology BIT filed Critical Beijing Institute of Technology BIT
Priority to CN2010102324632A priority Critical patent/CN101901257B/zh
Publication of CN101901257A publication Critical patent/CN101901257A/zh
Application granted granted Critical
Publication of CN101901257B publication Critical patent/CN101901257B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种多字符串匹配方法,属于字符串匹配技术领域。本发明基于传统的Wu-Manber方法,对规则集中的长字符串和短字符串进行了分离,在建SHIFT表时,对规则集中的长字符串和短字符串采取不同的处理方式,从而使得SHIFT表的最大表项不受到短字符串长度的限制,克服了其最大跳跃距离受到规则集中最短字符串长度限制的不足;通过引入HOT表,利用匹配过程中查找HOT的方法,使得窗口的最大跳跃距离得到增大的同时不会遗漏短字符串。本发明方法具有更高的匹配效率。

Description

一种多字符串匹配方法
技术领域
本发明涉及一种多字符串匹配方法,属于字符串匹配技术领域。
背景技术
在计算机领域,字符串匹配一直是计算机领域研究的焦点之一。字符串匹配问题可以描述为:已知需要匹配的t(t为正整数)个子串(通常称之为模式串,或规则),用P1,P2,…,P1表示,需要检索的字符串(通常称之为文本),用T[1…n](n为正整数)表示,查找在文本T[1…n]中所有出现的模式串,并报告其出现的位置。所谓多模式匹配,就是在文本串T[1…n]中一次匹配多个模式串P1,P2,…,P1,t=1时,多模式匹配蜕化为单模式匹配。
字符串匹配在拼写检查、语言翻译搜索引擎等应用中起着关键的作用;同时,字符串匹配也是众多信息内容安全系统中的关键技术之一。其中,多字符串匹配的方法目前已经广泛用于网络信息过滤,入侵检测系统和生物信息计算的基因序列比较等实际应用中。
这些应用的共同特点有以下两个方面:一是需要处理大量的数据(人类基因组共有30多亿个碱基对;2009年6月,中国网络国际出口带宽达到747541Mbps);二是需要匹配的关键词条目多(以基因序列为例,关键词条目达到O(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-1个字符开始,向后扫描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 ≤ l max l min - - - ( 1 )
其中,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满足
Figure BSA00000199047600032
然后返回到第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表的值与相应的前缀哈希值(对于长模式串,为h_long,对于短模式串,为h_short)相等,则将文本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步。
经过上述步骤的操作,即可完成多个模式串的匹配。
有益效果
本发明的一种多字符串匹配方法与已有技术比较,具有以下优点:本发明结合了原有Wu-Manber方法的窗口跳跃的优点,克服了其最大跳跃距离受到规则集中最短字符串长度限止的不足。通过引入HOT表,利用匹配过程中查找HOT的方法,使得窗口的最大跳跃距离得到增大的同时不会遗漏短字符串。本发明方法具有更高的匹配效率。
具体实施方式
下面结合附图和具体实施例对本发明方案进行详细说明。
实施例中,待匹配的模式串集合P中有3个模式串,分别为“english”、“kilometer”、“fine”,对应长度为7、9、4,其编号分别为0,1,2。其文本T的内容为“vmogenglishsdyfine”;使用本发明提出的方法在文本T中搜索模式串“english”、“kilometer”、“fine”的具体过程如下:
预处理阶段包括构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT,其具体工作步骤如下:
第1步:设置HOT表的大小SUM以及HOT表选取的字符块的长度s;将SUM设置为256,取s=2。
第2步:将模式串集合P中的全部模式串分为长模式串和短模式串两类,长模式串集合记为P1,短模式串集合记为P2,短模式串的数量记为SumP2;具体为:
第a步:确定跳越窗口的宽度与最短模式串长度的比值r,在本例中lmax=9,lmin=4,由公式1可得r=2。
第b步:根据公式2、公式3确定分类标准M值:M=2×4-(2-1)×2=6。
第c步:当模式串的长度大于6时,则判断其为长模式串;否则,判断其为短模式串;因此将“english”、“kilometer”归入长模式串集合;“fine”归入短模式串集合。该过程结束后,将原有模式串集合划分为长模式串集合与短模式串集合;长模式串集合包括:“english”、“kilometer”;短模式串集合包括:“fine”。
第d步:判断当前的短模式串的数量SumP2是否满足SumP2≤R×SUM,此时取R=50%,由于SumP2=1,R×SUM=50%×256=128,满足SumP2≤R×SUM,执行第3步。
第3步:对于全部长模式串的前6个长度的字符进行截取,对短模式串的前4个字符进行截取,得到StringL与StringS的集合,如表1所示。
表1StringL与StringS集合
Figure BSA00000199047600071
根据StringL与StringS,构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT;
首先选定构造时所用到的哈希函数,对于HASH表,PREFIX表,以及SHIFT表的构造,均选用哈希函数hash1;对于HOT表,选用哈希函数hash2;两个函数的定义如下:
unsigned int hash1(char*str){
 unsigned int hash_value=0;
 while(*str!=NULL){
    hash_value<<=6;
    hash_value+=*str++;
 }
 return hash_value & 0x2ffff;
}
unsigned int hash2(char*str){
   unsigned int hash_value=0;
   while(*str!=NULL){
      hash_value<<=6;
    hash_value+=*str++;
 }
 return hash_value & 0xff;
}
将HASH表、SHIFT表的大小选取为0x2ffff,PREFIX表的大小为规则集中模式串的数目3,HOT表的大小如前文中所示,用16进制表示为0xff。
具体构造过程为:
①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所示。
表2本发明方法得到的HASH表
  哈希值   ……   6835   ……   7077   ……   7141   ……
  对应模式串   NULL   english   NULL   kilometer   NULL   fine   NULL
②PREFIX表:选取B′=2,对于StringL集合中的“englis”的起始,选取“en”,计算哈希值为6574,将PREFIX表中“englis”的对应项PREFIX[0]赋值为6574;在“kilome”的起始,选取“ki”,计算其哈希值为6953,将PREFIX表中“kilome”的对应项PREFIX[1]赋值为6953;对于StringS集合中的“fine”,在起始处选取“fi”,计算其哈希值为6633,将PREFIX表中“fine”的对应项PREFIX[2]赋值为6633。PREFIX表如表3所示。
表3本发明方法得到的PREFIX表
  规则编号   0   1   2
  PREFIX   6574   6953   6633
③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表
  字符块   in   ne   fi   其他
  哈希值   174   229   233  ……
  HOT   1   1   1   0
④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-1=5,此时向前取字符块“li”,计算其哈希值为7017,将SHIFT[7017]的值设置为M-qi=1;将指针继续向前移动一个字符,将qi赋值为qi-1=4,此时向前取字符块“gl”,计算其哈希值为6700,将SHIFT[6700]的值设置为M-qi=2;继续按照该方法填写SHFTT表,直至指针移至距离模式串起始距离为2,此时qi=2,向前取字符块“en”,计算其哈希值为6574,将SHIFT[6574]的值设置为M-qi=4。再将指针向前移动一个字符,则有qi=1,此时距离该模式串的起始字符的距离为qi-1=0小于B-1=1。至此,对“english”的处理结束。对长模式串集合P1中的另一模式串“kilome”采用相同的方法处理,直至处理完P1中所有模式串。
再对短模式串集合P2中的模式串进行处理。
对于“fine”,将指针指向该模式串的第4个字符“e”,此时当前指针的位置为qj=6。向前取长度为2的字符块“ne”,计算其哈希值为7141,将SHIFT[7141]的值设置为lmin-qj=0;将指针向前移动一个字符,将qj赋值为qj-1=3,此时向前取字符块“in”,计算其哈希值为6830,将SHIFT[6830]的值设置为lmin-qj=1;将指针继续向前移动一个字符,将qj赋值为qj-1=2,向前取字符块“fi”,计算其哈希值为6633,将SHIFT[6633]的值设置为lmin-qj=2。再将指针向前移动一个字符,则有qj=1,此时距离该模式串的起始字符的距离为qj-1=0小于B-1=1。至此,对“fine”的处理结束。由于P2中仅含有模式串“fine”,对P2的处理也结束。从而得到构建好的SHIFT表,如表5所示。
表5本发明方法得到的SHIFT表
  字符块   is   me   ne   li   om   in   gl
  哈希值   6835   7077   7141   7017   7213   6830   6700
  SHIFT   0   0   0   1   1   1   2
  字符块   lo   fi   ng   il   en   ki   其他
  哈希值   7023   6633   7143   6828   6574   6953   ……
  SHIFT   2   2   3   3   4   4   5
下面对文本T进行扫描,寻找模式串,详细过程如下:
第1步:设一指针q_text,指向文本T的第6个字符“n”。
第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)×lmin-(r′)×s-(B-1)<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-1=5个字符开始,向后扫描B′=2个字符,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B′个字符的前缀哈希值h_long=6574;从当前指针往前的lmin-1=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)×lmin-(r′)×s-(B-1)<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-1=5个字符开始,向后扫描B′=2个字符“dy”,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B′个字符的前缀哈希值h_long=6521;从当前指针往前的lmin-1=3个字符开始,向后扫描B′=2个字符“fi”,使用预处理阶段建立PREFIX表所用到的哈希函数,计算这B′个字符的前缀哈希值h_short=6633;
第5步:查HASH表,找到HASH[7141]所对应的模式串为“fine”,将其在PREFIX表中的值“6633”与h_short对比,发现相等。因此,将文本与模式串“fine”逐一比较,发现完全匹配。于是,报告“fine”在文本中的位置。此时,指针q_text指向第18个字符)
第6步:将指针q_text向后移动一个字符(第19个字符),转到第8步。
第8步:判断指针q_text指向文本T的结束符,结束操作。
为说明本发明的效果,使用原始WU-MANBER方法对本实施例中的数据进行操作,得到SHIFT表如6所示:
表6原始WU-MANBER方法得到的SHIFT表
字符块 gl lo ne ng il in en ki fi 其它
  SHIFT   0   0   0   1   1   1   2   2   2   3
通过两种方法的比较,可以看出:本发明方法将原始的WU-MANBER方法中的最大跳跃距离lmin-1=3扩大至M-B+1=5,使得在匹配的过程中能够跳跃更远的距离,减少跳跃的次数,从而提高匹配的效率。实际上,根据模式串集合构造的SHFIT表中值的平均大小能够反映匹配过程中跳跃的平均长度。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,或者对其中部分技术特征进行等同替换,这些改进和替换也应视为本发明的保护范围。

Claims (1)

1.一种多字符串匹配方法,其特征在于:包括一个预处理阶段和一个扫描阶段;
预处理阶段包括构建哈希表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 ≤ l max l min - - - ( 1 )
其中,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满足
Figure FSA00000199047500012
然后返回到第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步;
经过上述步骤的操作,即可完成多个模式串的匹配。
CN2010102324632A 2010-07-21 2010-07-21 一种搜索引擎中的多字符串匹配方法 Expired - Fee Related CN101901257B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2010102324632A CN101901257B (zh) 2010-07-21 2010-07-21 一种搜索引擎中的多字符串匹配方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2010102324632A CN101901257B (zh) 2010-07-21 2010-07-21 一种搜索引擎中的多字符串匹配方法

Publications (2)

Publication Number Publication Date
CN101901257A true CN101901257A (zh) 2010-12-01
CN101901257B CN101901257B (zh) 2012-07-04

Family

ID=43226791

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2010102324632A Expired - Fee Related CN101901257B (zh) 2010-07-21 2010-07-21 一种搜索引擎中的多字符串匹配方法

Country Status (1)

Country Link
CN (1) CN101901257B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102063510A (zh) * 2011-01-17 2011-05-18 珠海全志科技有限公司 字符串的匹配查找方法
CN102929900A (zh) * 2012-01-16 2013-02-13 中国科学院北京基因组研究所 一种字符串匹配的方法及装置
CN106484730A (zh) * 2015-08-31 2017-03-08 北京国双科技有限公司 字符串匹配方法和装置
CN106708956A (zh) * 2016-11-29 2017-05-24 中国人民解放军国防科学技术大学 一种基于多url规则集的http数据匹配方法
CN107229759A (zh) * 2017-07-27 2017-10-03 深圳市乐宜科技有限公司 一种字符串模式匹配的方法
CN107870925A (zh) * 2016-09-26 2018-04-03 华为技术有限公司 一种字符串过滤方法和相关装置
CN108809908A (zh) * 2017-05-04 2018-11-13 中国科学院声学研究所 一种基于窗口选择的url过滤方法及系统
CN110321346A (zh) * 2019-05-28 2019-10-11 中国科学院计算技术研究所 一种字符串散列表实现方法和系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477559A (zh) * 2002-08-23 2004-02-25 华为技术有限公司 一种实现长字符串前缀匹配的方法
CN101051321A (zh) * 2007-05-18 2007-10-10 北京哲安科技有限公司 一种多字符串匹配方法和芯片
CN101251845A (zh) * 2008-03-13 2008-08-27 苏州爱迪比科技有限公司 利用改进的Wu-Manber算法进行多模式串匹配的方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1477559A (zh) * 2002-08-23 2004-02-25 华为技术有限公司 一种实现长字符串前缀匹配的方法
CN101051321A (zh) * 2007-05-18 2007-10-10 北京哲安科技有限公司 一种多字符串匹配方法和芯片
CN101251845A (zh) * 2008-03-13 2008-08-27 苏州爱迪比科技有限公司 利用改进的Wu-Manber算法进行多模式串匹配的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
《Department of Computer Science and Technology》 20061027 Tian Song等 AN ALGORITHM OF LARGE-SCALE APPROXIMATE MULTIPLE STRING MATCHING 全文 1 , 2 *

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102063510A (zh) * 2011-01-17 2011-05-18 珠海全志科技有限公司 字符串的匹配查找方法
CN102929900A (zh) * 2012-01-16 2013-02-13 中国科学院北京基因组研究所 一种字符串匹配的方法及装置
CN102929900B (zh) * 2012-01-16 2015-08-12 中国科学院北京基因组研究所 一种字符串匹配的方法及装置
CN106484730A (zh) * 2015-08-31 2017-03-08 北京国双科技有限公司 字符串匹配方法和装置
CN107870925A (zh) * 2016-09-26 2018-04-03 华为技术有限公司 一种字符串过滤方法和相关装置
CN106708956A (zh) * 2016-11-29 2017-05-24 中国人民解放军国防科学技术大学 一种基于多url规则集的http数据匹配方法
CN106708956B (zh) * 2016-11-29 2019-08-16 中国人民解放军国防科学技术大学 一种基于多url规则集的http数据匹配方法
CN108809908A (zh) * 2017-05-04 2018-11-13 中国科学院声学研究所 一种基于窗口选择的url过滤方法及系统
CN108809908B (zh) * 2017-05-04 2020-05-26 中国科学院声学研究所 一种基于窗口选择的url过滤方法及系统
CN107229759A (zh) * 2017-07-27 2017-10-03 深圳市乐宜科技有限公司 一种字符串模式匹配的方法
CN107229759B (zh) * 2017-07-27 2020-08-11 深圳市乐宜科技有限公司 一种字符串模式匹配的方法
CN110321346A (zh) * 2019-05-28 2019-10-11 中国科学院计算技术研究所 一种字符串散列表实现方法和系统
CN110321346B (zh) * 2019-05-28 2021-09-21 中国科学院计算技术研究所 一种字符串散列表实现方法和系统

Also Published As

Publication number Publication date
CN101901257B (zh) 2012-07-04

Similar Documents

Publication Publication Date Title
CN101901257B (zh) 一种搜索引擎中的多字符串匹配方法
US7882109B2 (en) Computer representation of a data tree structure and the associated encoding/decoding methods
CN103412858B (zh) 用于文本或网络内容分析的大规模特征匹配的方法
CN105335481B (zh) 一种大规模字符串文本的后缀索引构造方法及装置
CN104317891B (zh) 一种对页面标注标签的方法及装置
CN101964059B (zh) 构建级联分类器的方法、识别对象的方法及装置
CN101753445A (zh) 基于关键字分解Hash算法的快速流分类方法
CN101286935A (zh) 一种基于ip地址范围的路由查找方法
CN105335456B (zh) 一种用于环境保护法规检索的关联优先排序方法
CN101251845B (zh) 利用改进的Wu-Manber算法进行多模式串匹配的方法
CN103714149A (zh) 一种自适应增量式的深层网络数据源发现方法
CN103440331A (zh) 基于逆波兰和多叉树的搜索引擎查询语句解析方法
CN101848248B (zh) 一种规则查找方法和装置
CN108509505A (zh) 一种基于分区双数组Trie的字符串检索方法及装置
CN108471382A (zh) 一种基于节点度值的复杂网络聚类算法攻击方法
CN101908102A (zh) 基于茎区的核糖核酸二级结构的预测方法及装置
CN103544208B (zh) 海量特征串集合的匹配方法及系统
CN101127990A (zh) 一种查找手机短信的方法
CN105069084B (zh) 一种面向海量数据高效取差集的方法
CN108537279A (zh) 基于改进Adaboost算法的数据源分类器构建方法
Yang et al. On characterizing and computing the diversity of hyperlinks for anti-spamming page ranking
CN103235794A (zh) 一种基于文档序号处理的倒排索引表示方法及系统
CN103559244B (zh) 基于mbx格式的邮件正文的获取方法及系统
CN102521357A (zh) 一种利用自动机实现文本精确匹配的系统和方法
CN100573550C (zh) 分类器动态选择与循环集成方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20120704

Termination date: 20130721