CN101901257B - 一种搜索引擎中的多字符串匹配方法 - Google Patents
一种搜索引擎中的多字符串匹配方法 Download PDFInfo
- Publication number
- CN101901257B CN101901257B CN2010102324632A CN201010232463A CN101901257B CN 101901257 B CN101901257 B CN 101901257B CN 2010102324632 A CN2010102324632 A CN 2010102324632A CN 201010232463 A CN201010232463 A CN 201010232463A CN 101901257 B CN101901257 B CN 101901257B
- 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.)
- Expired - Fee Related
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种多字符串匹配方法,属于字符串匹配技术领域。本发明基于传统的Wu-Manber方法,对规则集中的长字符串和短字符串进行了分离,在建SHIFT表时,对规则集中的长字符串和短字符串采取不同的处理方式,从而使得SHIFT表的最大表项不受到短字符串长度的限制,克服了其最大跳跃距离受到规则集中最短字符串长度限制的不足;通过引入HOT表,利用匹配过程中查找HOT的方法,使得窗口的最大跳跃距离得到增大的同时不会遗漏短字符串。本发明方法具有更高的匹配效率。
Description
技术领域
本发明涉及一种搜索引擎中的多字符串匹配方法,属于字符串匹配技术领域。
背景技术
在计算机领域,字符串匹配一直是计算机领域研究的焦点之一。字符串匹配问题可以描述为:已知需要匹配的t(t为正整数)个子串(通常称之为模式串,或规则),用P1,P2,…,Pt表示,需要检索的字符串(通常称之为文本),用T[1…n](n为正整数)表示,查找在文本T[1…n]中所有出现的模式串,并报告其出现的位置。所谓多模式匹配,就是在文本串T[1…n]中一次匹配多个模式串P1,P2,…,Pt,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)。
其中,lmax为模式串集合P中最长的模式串的长度;lmin为模式串集合P中最短的模式串长度。
第b步:根据公式(2)确定分类标准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表的值与相应的前缀哈希值(对于长模式串,为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)确定分类标准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集合
StringS | f | i | n | e |
根据StringL与StringS,构建哈希表HASH、跳转表SHIFT、前缀表PREFIX和短模式串过滤表HOT;
首先选定构造时所用到的哈希函数,对于HASH表,PREFIX表,以及SHIFT表的构造,均选用哈希函数hash1;对于HOT表,选用哈希函数hash2;两个函数的定义如下:
将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);
其中,lmax为模式串集合P中最长的模式串的长度;lmin为模式串集合P中最短的模式串长度;
第b步:根据公式(2)确定分类标准M值:
M=r×lmin-(r-1)×s (2)
第c步:当模式串的长度大于M时,则判断其为长模式串;否则,判断其为短模式串;
第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步;
经过上述步骤的操作,即可完成多个模式串的匹配。
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 CN101901257A (zh) | 2010-12-01 |
CN101901257B true 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) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102063510B (zh) * | 2011-01-17 | 2012-08-29 | 珠海全志科技股份有限公司 | 字符串的匹配查找方法 |
CN102929900B (zh) * | 2012-01-16 | 2015-08-12 | 中国科学院北京基因组研究所 | 一种字符串匹配的方法及装置 |
CN106484730A (zh) * | 2015-08-31 | 2017-03-08 | 北京国双科技有限公司 | 字符串匹配方法和装置 |
CN107870925B (zh) * | 2016-09-26 | 2021-08-20 | 华为技术有限公司 | 一种字符串过滤方法和相关装置 |
CN106708956B (zh) * | 2016-11-29 | 2019-08-16 | 中国人民解放军国防科学技术大学 | 一种基于多url规则集的http数据匹配方法 |
CN108809908B (zh) * | 2017-05-04 | 2020-05-26 | 中国科学院声学研究所 | 一种基于窗口选择的url过滤方法及系统 |
CN107229759B (zh) * | 2017-07-27 | 2020-08-11 | 深圳市乐宜科技有限公司 | 一种字符串模式匹配的方法 |
CN110321346B (zh) * | 2019-05-28 | 2021-09-21 | 中国科学院计算技术研究所 | 一种字符串散列表实现方法和系统 |
Citations (3)
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算法进行多模式串匹配的方法 |
-
2010
- 2010-07-21 CN CN2010102324632A patent/CN101901257B/zh not_active Expired - Fee Related
Patent Citations (3)
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)
Title |
---|
Tian Song等.AN ALGORITHM OF LARGE-SCALE APPROXIMATE MULTIPLE STRING MATCHING.《Department of Computer Science and Technology》.2006,全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN101901257A (zh) | 2010-12-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101901257B (zh) | 一种搜索引擎中的多字符串匹配方法 | |
US7882109B2 (en) | Computer representation of a data tree structure and the associated encoding/decoding methods | |
CN105335481B (zh) | 一种大规模字符串文本的后缀索引构造方法及装置 | |
CN102308533B (zh) | 对报文进行分类的方法及装置 | |
CN102184205B (zh) | 基于可扩展精度混沌哈希的多模式串匹配方法 | |
CN104268280B (zh) | 一种基于键值数据库的层次化存储与查询方法 | |
CN101964059B (zh) | 构建级联分类器的方法、识别对象的方法及装置 | |
CN101286935A (zh) | 一种基于ip地址范围的路由查找方法 | |
CN104317891B (zh) | 一种对页面标注标签的方法及装置 | |
CN102148746A (zh) | 一种报文分类方法和系统 | |
CN105335456B (zh) | 一种用于环境保护法规检索的关联优先排序方法 | |
CN102469134A (zh) | 一种ip地址检索方法及装置 | |
CN101848248B (zh) | 一种规则查找方法和装置 | |
CN108509505A (zh) | 一种基于分区双数组Trie的字符串检索方法及装置 | |
CN103714149A (zh) | 一种自适应增量式的深层网络数据源发现方法 | |
CN101251845B (zh) | 利用改进的Wu-Manber算法进行多模式串匹配的方法 | |
CN105515997B (zh) | 基于bf_tcam实现零范围扩张的高效范围匹配方法 | |
CN103440331A (zh) | 基于逆波兰和多叉树的搜索引擎查询语句解析方法 | |
CN110516118A (zh) | 一种字符串匹配方法、设备及计算机存储介质 | |
CN104077385A (zh) | 一种文件的分类及检索方法 | |
CN101908102B (zh) | 基于茎区的核糖核酸二级结构的预测方法及装置 | |
CN101127990A (zh) | 一种查找手机短信的方法 | |
US20100057809A1 (en) | Information storing/retrieving method and device for state transition table, and program | |
CN103927325A (zh) | 一种对url进行分类的方法及装置 | |
CN102419746A (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 |