一种高速精确单模式串匹配算法.docx

上传人:b****6 文档编号:5607198 上传时间:2022-12-28 格式:DOCX 页数:14 大小:189.26KB
下载 相关 举报
一种高速精确单模式串匹配算法.docx_第1页
第1页 / 共14页
一种高速精确单模式串匹配算法.docx_第2页
第2页 / 共14页
一种高速精确单模式串匹配算法.docx_第3页
第3页 / 共14页
一种高速精确单模式串匹配算法.docx_第4页
第4页 / 共14页
一种高速精确单模式串匹配算法.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

一种高速精确单模式串匹配算法.docx

《一种高速精确单模式串匹配算法.docx》由会员分享,可在线阅读,更多相关《一种高速精确单模式串匹配算法.docx(14页珍藏版)》请在冰豆网上搜索。

一种高速精确单模式串匹配算法.docx

一种高速精确单模式串匹配算法

计算机研究与发展

ISSN1000󰀁1239󰀁CN11󰀁1777󰀁TP一种高速精确单模式串匹配算法

范洪博

21,2󰀁󰀁姚念民1(哈尔滨工程大学计算机科学与技术学院󰀁哈尔滨󰀁150001)(绥化学院计算机科学与技术系󰀁黑龙江绥化󰀁152000)

(fanhongbo@)

AFastandExactSinglePatternMatchingAlgorithm

FanHongbo1,2andYaoNianmin1

1(CollegeofComputerScienceandTechnology,HarbinEngineeringUniversity,Harbin150001)

2(DepartmentofComputerScienceandTechnology,SuihuaUniversity,Suihua,Heilongjiang152000)

Abstract󰀁Stringmatchingproblemisafundamentalproblemincomputerscience.Itisthekeyproblemofmanyimportantscopessuchasnetworksecurity,informationretrievalandfiltration,computationalbiology,etc.Andthedesignofexactsinglepatternstringmatchingalgorithmwithhighperformanceisthebasisofallstringmatchingproblems.Inthispaper,theauthorsimproveoneofthefastestexactsinglepatternmatchingalgorithmsknownonEnglishtext,whichisSBNDM2.ThesimplestformoftheBNDMcoreloopisobtained,inwhichthereareonly5instructionspercharacterreadbyamendingtherelationshipbetweenpositioninthepatternandbitinthebitmask.Andacross󰀁borderprotectionmethodisaddedtothealgorithminordertoreducethecostofcross󰀁borderinspection.TwoalgorithmsnamedS2BNDMandS2BNDM󰀂arepresented.TheexperimentalresultsindicatethatbothS2BNDMandS2BNDM󰀂arefasterthanSBNDM2inanycase.ItcanbeconsideredthatS2BNDMisthefastestalgorithmonEnglishtext(2

Keywords󰀁stringmatching;exactsinglepattern;designofalgorithm;bitparallelism;textsearching

串匹配问题是计算机科学的基础问题之一,是网络安全、信息检索与过滤、计算生物学等众多领

域的核心问题,其中,高速精确单模式匹配算法设计又是各种串匹配问题的基础.基于SBNDM2,通过修改位掩码有效位到无符号整数的高位,将BNDM算法核心循环化简至最简形式(5指令󰀁字符),并引入越界保护机制,提出S2BNDM系列精确单模式匹配算法.实验结果显示,S2BNDM系列算法在任何摘󰀁要󰀁情况下都快于SBNDM2,对于英文语料(m<32)和DNA序列(m<8),S2BNDM系列算法为现有已知最快算法.

关键词󰀁串匹配;精确单模式;算法设计;位并行;文本搜索

中图法分类号󰀁TP391.3

󰀁󰀁串匹配问题指按给定的匹配条件在某一符号序

列(称为文本T)中查找另一个(或一些)符号序列

(称为模式P)的所有出现位置的搜索问题.串匹配

问题是计算机科学的基本问题之一,是网络安全、信

息检索与过滤、计算生物学等重要领域的核心问题,

󰀁收稿日期:

2008-10-05;修回日期:

2009-02-09也被广泛地应用到其他涉及文本处理的领域中(如语言翻译、OCR识别、拼写检查等领域).目前,随着网络安全问题的凸显,以及计算生物学、网络信息过滤等领域的快速发展,经典串匹配算法已经无法满足串匹配类应用对串匹配算法性能的需求.

󰀁(;(

1342计算机研究与发展󰀁2009,46(8)

精确单模式匹配是所有串匹配问题的基础,其他形式的串匹配问题均由精确单模式匹配算法扩展而来,其应用范围也最为广泛.本文侧重于提出一种具有更高实际性能的精确单模式串匹配算法.如无特殊说明,文中涉及算法均为精确单模式串匹配算法.目前已知近百种精确单模式匹配算法,其中在实际匹配中表现较好的算法是TBM[1],SSABS[2],FAOSO[3],SBNDM2[4],BOM

[5]

U,V,W来表示󰀁*中串.若模式P=UVW(U,V,W可以为空串),则串U,V,W均为P的子串.把W为P的子串记为W∀suf(P),串W中从W[x]到W[y]的子串记为W[x!

y].本文使用C语言进行描述.

串匹配算法使用滑动窗口概念完成匹配.滑动窗口与模式等长,窗口中字符可以与模式建立顺序的对应关系,这样将精确单模式匹配问题转换为判断模式与窗口内文字是否匹配的问题.设窗口首字符为T[loc],若󰀂j(0j

串匹配算法可分为按前缀匹配(KMP,shift󰀁and󰀁or

[10]

NEW[6]等算法.

TBM,SSABS,SBNDM2算法在较大字符集,较短

模式时有较好的表现,而NEW和BOM在模式较长时性能较高.特别是SBNDM2算法,在应用最为广泛的英文语料搜索中有较高的性能.实验结果显示,在英文语料下,模式长度m<30时,SBNDM2为目前已知最快算法.

在字符串匹配领域,大量算法(包括BNDM

[8]

[7]

系列算法)已达到平均时间复杂度的理论下界,故目前研究主要集中在简化算法或者更有效利用系统资源角度.本领域中,一个众所周知的原则是算法越简单,则性能越高.如在英文语料上,拥有线性最差时间复杂度,但实现复杂的KMP

[9]

的性能甚至低于

等)、按后缀匹配(BM

[11]

原始的暴力匹配.本文希望在SBNDM2基础上进行改进,通过简化其执行时的动作,提出一种实际性能更高的串匹配算法.

SBNDM2隶属于BNDM系列算法.可以证明:

在X86平台上,BNDM类算法的核心循环中每读入1个字符至少需要5条机器指令.现有BNDM类算法均未达到此最简形式.本文通过修改BNDM类算法的位掩码有效位到无符号整数的高位,成功将BNDM类算法的核心循环化简至最简形式.同时,本文在SBNDM2中引入下标越界保护,降低了下标越界检查的开销.称本文提出的算法为S2BNDM系列算法(simplest2characterunrollingbackwardnondeterministicDawgmatchingalgorithm).实验结果显示,本文所述算法在任何情况下的性能均高于SBNDM2,对于英文语料(m<32)和DNA序列(m<8),本文所述算法为目前性能最高的算法.

tunedBM等)和

按子串匹配(BNDM,BOM等)3大类,S2BNDM等BNDM类算法均属于按子串匹配类算法.子串匹配机制如图1所示.算法从窗口中自右向左读入字符,记已读入字符串为U,若U∀suf(P),并且再读入下一个字符后,U

suf(P),此时将引发一次跳

跃,窗口将跳跃至字符之后.若|U|=m,则说明此时发生了模式匹配,应该报告窗口位置.

Fig.1󰀁Sub󰀁stringmethod.

图1󰀁子串跳跃机制

为快速判定U∀suf(P)是否成立,BNDM类算

1󰀁相关概念与定义

已知字符集󰀁,|󰀁|=󰀂,󰀁*为其正闭包,文本串T=t0t1!

tn-1,模式串P=p0p1!

pm-1,P,T∀󰀁.精确单模式匹配指求解集合O={i|P[k]=T[i+

j]

.用,!

来表示,*

法使用位并行的方法进行匹配.位并行是一种将多个值同时放入一个机器字内,利用位操作一次更新这多个值的方法.称这个放入多个值的机器字为位向量或者位掩码.为表示位向量或位掩码的值,可以采用列出该机器字的每一位的方法表示,也可以简02401.

范洪博等:

一种高速精确单模式串匹配算法1343

建立了对应的位掩码,并且将这些位掩码存于位掩码

2󰀁BNDM类算法机理

首个使用子串机制的算法是BDM,该算法也是首个具有最优的平均时间复杂度的算法.BDM用一种复杂的确定性后缀自动机(Dawg)来识别子串,其实用性能较低.BNDM用位并行机制和使用非确定后缀自动机对BDM进行化简,该机制非常成功,使BNDM成为当时最快的算法之一.目前,BNDM已被扩展为一大类精确单模式匹配算法,统称为BNDM类算法,包括BNDM,TubroBNDM[7],SBNDM

[12]

表B中.BNDM类算法按照子串机制在窗口中自后向前读入字符,每读入一个字符后,用B[]来更新D,可以通过D来快速判定U∀suf(P)是否成立.2.1󰀁位掩码与位向量中位的定义

为通过位操作来进行匹配,首先应建立字符或已读入字符串在P中出现位置与无符号整数内的位之间的对应关系.设机器字长为ws,如果m

.

rv

rv

TNDM

[12]

LNDM

[13]

等,也包括本文

改进的基础算法SBNDM2.

在BNDM系列算法匹配过程中,算法维护一个位向量D,D记录了U在P中的所有出现位置.为实现D的维护,算法在预处理阶段中对󰀁中每个字符

Fig.2󰀁CorrespondingrelationshipbetweenthepositioninpatternandthebitinbitmaskorbitvectorinBNDM.

图2󰀁BNDM算法位掩码或位向量中位的定义

2.2󰀁位向量的更新

设窗口最末字符为T[pos].为通过D来表示U在P中的所有位置,现定义位向量D具有如下性质:

D中所有被置1的位所在位置表示U在P中所有出现位置(对应关系如图1所示),即D中第i位被设置的充要条件为U=patrv[i!

i-|U|+1].为实现此要求,现将D的定义分解为如下递推关系:

1)因空串可以匹配P的任意位置,在没有读入任何字符之前,D中所有位都应被设置;

2)设D中第i位被设置的充要条件为U=patrv[i!

i-|U|+1];

3)如果U首字符的前一个字符(T[pos-|U|])被读入后,D中第i+1位被设置的充要条件为条件2为真(等价于D中第i位被设置)并且字符在P中的一个出现位置为patrv[i+1](等价于B[]的第i+1位被设置).

由数学归纳法可知条件1)2)3)为D定义的充要条件.据此,我们得到BNDM算法中D的更新公式:

1ws

2)每读入一个字符,使用公式D∃(D<<1)&B[]来更新D.

这样,D中所有被设置的位就与U在P中的所有出现位置一一对应.因此若D中存在被设置的位(即D#0),则说明U∀suf(P),应继续读入字符;反之,则应按照图1所示进行跳跃.

BNDM中还引入了一个不必要的加速机制,SBNDM(BNDM的首个简化算法)去掉了该加速机制.在大多数情况下,SBNDM的性能均高于BNDM.

3󰀁SBNDM2算法介绍

SBNDM2由SBNDM改进而来,SBNDM2通过带立即检查的startloop和循环展开模拟q󰀁grams来改进SBNDM.

1)带立即检查的startloop.

根据BNDM算法定义,在没有读入任何字符前,D=1.设窗口最末字符T[pos]=!

.这样在字符!

读入后,D=B[!

].因此在算法读入首个字符时,可无需进行完整的BNDM循环,直接设置D=B[!

],然后判断D是否为0即可.此机制为立即检=ws

1344计算机研究与发展󰀁2009,46(8)

较高,可以把动作提至单独的循环,称此循环为startloop.为表示区别,称算法原BNDM中逐字读入的循环为matchloop或称BNDM循环.

2)循环展开模拟q󰀁grams.

显然,startloop中的操作比原始BNDM循环中少,性能更高.因此为提高算法性能,应让尽可能多的跳跃发生在startloop中,即应提高startloop中D=0的概率.在本领域中,处理类似问题的常见做法是q󰀁grams.q󰀁grams指使用窗口尾部的一块字符来代替单独字符而进行判断是否跳跃的方法.q󰀁grams是一种空间换时间的方法.如不使用Hash技术,使用长为q的块进行判断通常需要至少󰀂的预处理空间,如果这个空间较大,则算法性能将因缓存颠簸现象而严重降低.SBNDM2提出一种利用循环展开模拟q󰀁grams的方法,该方法只需使用单字符的B表(即SBNDM的B表).该方法在startloop中使用D=(B[T[pos]]<<1)&B[T[pos-1]]来设置D,从而完成了与q󰀁grams同样的功能.该机制在没有增加空间占用的条件下,提高了startloop中跳跃的概率与算法性能.使用双字环展开机制后,startloop中跳跃距离下降到m-1,在matchloop中检查其他m-2个字符.

SBNDM2相关代码如下:

算法1.SBNDM2相关代码.󰀁*预处理阶段*󰀁unsignedintk=1;

unsignedintB[ASIZE];

memset(B,0,ASIZE*sizeof(int));for(intj=m-1;j>=0;j--)

{B[P[j]]|=k;k<<=1;}

j=0;

while((memcmp(P,P+m-1-j,j+1)==0)&&(j

intmatchshift=m-j;

unsignedintD;intpos=m-1;intmatchtime=0;󰀁*匹配阶段*󰀁while(pos

{D=(B[T[pos]]<<1)&B[T[pos-1]];󰀁while((D==0)&&(pos

󰀁󰀁{pos+=m-1;D=(B[T[pos]]<<1)&B[T[pos-1]];}󰀁*startloop*󰀁󰀁j=m-2;D<<=1;pos-=2;D&=

B[T[pos]];󰀁(q

󰀁󰀁{j--;D<<=1;pos--;D&=

B[T[pos]];}󰀁*matchloop*󰀁󰀁if(j==0){matchtime++;pos+=matchshift;}󰀁pos+=m.}

4󰀁化简原始BNDM循环

引理1.在X󰀁86平台下,BNDM循环最简形式由5条指令组成,其中分支指令1条.

证明.BNDM类算法位向量的更新公式为D∃(D<<1)&B[].该公式中共包含3条指令(读入字符,D左移1位,&操作).D更新后,判断U∀suf(P)是否成立至少需要1条分支语句,移动读入字符指针还需1条指令.以上5条指令(分支指令1条)为组成BNDM循环所必须的,由这5条指令实现的循环为BNDM循环的最简形式.

证毕.

现有BNDM类算法均没有达到此最简形式.如BNDM为8条指令(分支语句2条),SBNDM和SBNDM2为7条(分支语句2条),其他算法要更多.

现对BNDM核心循环进行简化.首先考虑减少算法中的分支语句数.在SBNDM2中,BNDM核心循环中一共有2条分支语句,分别用来检查U∀suf(P)是否成立和检查U是否超出窗口边界.因P中只有一个子串与窗口等长,即P本身,因此在U超出窗口边界前,D一定具有某种性质,若合理利用此性质,可能只需要通过检查D来完成2条分支语句的工作.

引理2.在SBNDM2核心BNDM循环中,无需每读入一个字符就检查变量j是否为0,设lim=0ws-m10m-1,只需当D=lim后再检查j是否为0即可.

证明.若U=P,则U是P的前缀,并且U在P中唯一出现.根据D的定义,此时D中应只有对应P[0]的位被置1,即D=lim.故D=lim为U=P的必要条件(非充分条件).因变量j为0表示已读入的m个字符是P的子串,等价于U=P.故j=0只可能发生在D=lim后,无需每读入一个字符就检查变量j是否为0.证毕.

引理3.若修改BNDM类算法中位的定义为如图3所示形式,则可将2条分支指令合并为1条.即

范洪博等:

一种高速精确单模式串匹配算法1345

while(D)

{j--;D<<=1;pos--;D&=B[T[pos]];}if(j==0){匹配的输出动作.}

证明.在修改位的定义如图3所示后,原lim变量将变更为10

ws-1

lim󰀂.此时,若不检查是否D=lim󰀂,则算法会再次进入matchloop,在此次循环中,D中唯一的被设置的位将被左移溢出,使得D值为0.因此在此次循环后算法将正确退出matchloop.因此,可将每读入一个字符时的分支语句由2条降至1条,使总指令数降至6条.

证毕

.

记为lim󰀂.这样,若U是P的

唯一出现前缀(含U=P),则在检查D&&j时,D=

Fig.3󰀁Modifiedcorrespondingrelationshipbetweenthepositionsinpatternandthebitsinbitmaskorbitvector.

图3󰀁修改后位掩码或位向量中位的定义

󰀁󰀁使用引理3后,当U为P的唯一出现前缀时存在一次多余的字符读入,因此,matchloop中变量j的初值应由SBNDM2中的m-3改为m-2.因U是P的唯一出现前缀的概率是󰀂(1-󰀂)情况下,引理3可提高SBNDM2的性能.

定理1.在引理3的基础上,可以继续化简BNDM核心循环至5条指令的最简形式.设窗口首字符的前一字符为T[pos1],则在应用引理3后,U=P的充要条件是在退出matchloop后,pos=pos1.

证明.当U=P时,引理3将造成一次多余的字符读入,因此matchloop中,pos最终将指向U的前一个字符,即pos=pos1.而在退出matchloop后发现pos=pos1时,则算法一共读入了m+1个字符,因引理3至多存在一个字符的多余读入,故读入的前m字符是模式的子串,即U=P.由此,pos=pos1是模式匹配的充要条件.pos1可以在进入matchloop之前计算得到,从而无需在匹配过程中统计读入字符个数.

使用定理1后的matchloop的代码为:

while(D)

{D<<=1;pos--;D&=B[T[pos]];}if(pos==pos1){匹配的输出动作.}

此时的循环体中只有5条指令,其中分支指令1条.已经达到了BNDM类算法的最简形式.

相对于只使用引理3时,定理1在matchloop外增加了一次减法操作.若进入matchloop的概率较小(如大字符集或短模式),使用定理1可能反造成性能下降.选择那种算法性能最优,还需实验证毕.

-k

-k

m-k

5󰀁越界保护

待匹配的文本一般较长,发生下标越界的概率较低,每次跳跃中都判断是否发生下标越界的方法将造成性能浪费.可以通过引入越界保护机制降低因越界检查造成的开销.

TunedBM算法中首先提出了越界保护的概念,NEW算法对其进行了扩展,提出一种新的越界

保护机制,该机制可以用于本文所述算法中.这种机制在文本后接入模式串(称为越界保护带),则越界时必先出现一次模式匹配,因此可以将下标越界检测的动作移入执行概率较低的模式匹配的输出动作中,从而降低了越界检查的开销.

在引入越界保护后的,称只使用引理3的算法为S2BNDM,称使用定理1的算法为S2BNDM󰀂.2个算法匹配过程的相关代码如下(2个算法预处理部分一致):

算法2.S2BNDM算法.

󰀁*预处理阶段*󰀁

unsignedintk=1<<(ws-1-m);unsignedintB[ASIZE];󰀁*ASIZE=󰀂*󰀁memset(B,0,ASIZE*sizeof(int));

for(intj=m-1;j>=0;j--){B[P[j]]|=k;k<<=1;}j=0;

while((memcmp(P,P+m-1-j,j+1)==0)&&(j

intpos=m-1;unsignedintD;intmatchtime=0;

;

(k>

2),其出现概率较小,造成的性能损失也较小.通常

1346计算机研究与发展󰀁2009,46(

8)

󰀁*匹配阶段*󰀁while

(1)

{D=B[T[pos-1]]&(B[T[pos]]<<1);while(D==0)

󰀁{pos+=m-1;D=B[T[pos-1]]&(B[T[pos]]<<1);}󰀁*startloop*󰀁j=m-2;D<<=1;pos-=2;D&=B[T[pos]];while(D)

󰀁{D<<=1;j--;pos--;D&=B[T[pos]];}󰀁*matchloop*󰀁if(j==0)

󰀁{if(pos<=n-m){matchtime++;

pos+=matchshift;}elsereturn;}pos+=m.}󰀁*S2BNDM*󰀁

算法3.S2BNDM󰀂算法.󰀁*PreprocessingissamewithS2BNDM*󰀁󰀁*searching*󰀁intpos1;while

(1)

{D=B[T[pos-1]]&(B[T[pos]]<<1);while(D==0)

󰀁{pos+=m-1;D=B[T[pos-1]]&(B[T[pos]]<<1);}󰀁*startloop*󰀁pos1=pos-m;D<<=1;pos-=2;D&=B[T[pos]];while(D)

{pos--;D<<=1;D&=B[T[pos]];}󰀁*matchloop*󰀁if(pos==pos1)

󰀁{if(pos<=n-m){matchtime++;pos+=

matchshift;}elsereturn;}pos+=m.}󰀁*S2BNDM󰀂*󰀁

6󰀁实验数据

本文实验平台为IntelE2160OC2.7GHz󰀁2GRAM󰀁gcc3.4.2(-O3优化).待匹配文本为Holy󰀁bible.txt(4.22MB)和E.coli

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1