一种高速精确单模式字符串匹配的方法

文档序号:6483520阅读:234来源:国知局
专利名称:一种高速精确单模式字符串匹配的方法
技术领域
本发明涉及信息处理领域中一种用于提高处理文本数据搜索性能的方法,具体地说是一种精确单模式字符串匹配的方法。
背景技术
字符串匹配问题指在给定符号序列中找出具有某种性质的符号子序列的问题。字符串匹配问题是计算机科学的基本问题之一,其应用范围极其广泛。在几乎所有涉及文本处理的领域或者可以规划为文本处理的领域中均包含字符串匹配的相关要求(如搜索引擎、语言翻译、OCR识别、拼写检查等领域)。特别是在入侵检测/病毒检测、网络信息过滤与检索、计算生物学/生物信息学等重要领域中,字符串匹配问题已经成为这些领域的核心问题。但目前,字符串匹配技术的发展落后于计算机硬件、计算机网络的发展,现有字符串匹配方法难以满足应用程序对串匹配性能的需要,字符串匹配的速度已经成为决定字符串匹配类应用软件性能的瓶颈与关键。
在字符串匹配领域的各类问题中,精确单模式串匹配问题为字符串匹配领域各类问题的基础。而且精确单模式匹配本身的应用也最为广泛。因此,在字符串匹配领域中,提出一种更高速的精确单模式串匹配方法有特别重要的意义。目前有案可查的进行精确单模式匹配的方法有上百种。
在实际匹配中,在英文语料(或ASCII字符集)中进行检索最为常见,同时待匹配的模式也很少见到超过32(目前32位计算机的机器字长)的,在此条件下,截止至本专利申请时,目前最高速的精确单模式匹配方法之一为Holub J与DurianB于2005年提出的SBNDM2算法。(Fast variants of bit parallel approachto suffix automata.InThe Second Haifa Annual International Stringology ResearchWorkshop of the Israeli Science Foundation,CRI,University ofHaifa,Israel,2005.)SBNDM2算法隶属于采用子串匹配机制和位并行机制完成搜索的BNDM类算法。若能在SBNDM2算法的基础上,针对其不足进行改进,有可能获得更高性能的精确单模式串匹配的方法。
SBNDM2算法在匹配过程中维护了一个位向量,该位向量中被设置的位记录了已读入字符串的所有出现位置,根据此位向量能够快速判断已读入字符串是否为模式的子串,算法利用此结果实现模式匹配。算法匹配时从滑动窗口尾部反向读入字符。如果已读入字符串为模式的子串,则可以继续从窗口中反向读入字符直到发现模式匹配(即已读入字符长度与模式等长);否则,将产生一个跳跃,将窗口首字符与发现的模式最长子串首字符对齐。
SBNDM2包含预处理和搜索两个主要阶段。为实现利用位并行机制进行字符串匹配,SBNDM2的预处理阶段生成字符集中每个字符的位掩码(以无符号整数形式存储),掩码记录了该字符在模式的所有出现位置。SBNDM2将匹配的过程分裂为两个相对独立的循环。内层循环(称Scan Loop)一次读入窗口最末的2个字符,然后利用已读入字符的位掩码生成位向量,并检查这两个字符是否是模式的子串。若已读入的两个字符不是模式的子串,则跳跃(模式长度-1)个字符,并重复Scan Loop;反之,则进入外层循环(称Match Loop)。外层循环在窗口内继续自后向前逐个读入字符,每读入一个字符就利用该字符的位掩码更新位向量,并根据更新后的位向量检查已读入字符串是否是模式的子串,直到发现某字符读入后不再是模式的子串为止,然后跳跃窗口首字符至该字符之后,重新进入Scan Loop。若窗口首字符读入后,已读入字符串仍然是模式的子串,则说明发生了模式匹配。SBNDM2算法的具体实现参见附录1。
SBNDM2算法存在如下几点不足 1)在Match Loop中,SBNDM2算法在每读入一个字符时需要7条具体操作,其中两条分支操作。理论上,Match Loop中完成一次字符读入只需要5项操作,其中分支指令1条,不过至今尚未有能达到此最简形式的算法出现。如果能简化Match Loop到5条指令,其中分支指令1条的最简形式,将能有效提高算法性能。
2)在SBNDM2算法中,在每次跳跃的过程中都必须进行一次下标越界的检查以确定待读入字符是否已经超出文本的边界。由于一般待匹配的文本都比较大,出现下标越界的概率很小,如此频繁的下标越界检查将降低算法的性能。
3)虽然Scan Loop和Match Loop都能实现跳跃,但SBNDM2算法性能主要受Scan Loop的影响。在Scan Loop中,SBNDM2算法只使用两个字符进行循环展开,过于刻板,应该根据匹配条件(如字符集大小,模式长度)来判断进行循环展开的字符总数。
如能针对该算法以上不足进行改进,将有可能得到性能更高的精确单模式串匹配算法。

发明内容
本发明的目的在于提供一种速度更高、适用范围更广泛的一种高速精确单模式字符串匹配的方法。本说明书中,记文本T长度为n,模式P长度为m。
本发明的目的是这样实现的 包含预处理和搜索; 所述的预处理主要包含如下三个步骤 a)对模式的预处理首先给定一种字符在模式中出现位置和位掩码中的位的一种对应关系,然后对于字符集中的每个字符生成其对应位掩码,位掩码为一个无符号整数,若该字符在模式中出现,则位掩码中该字符在模式中每个出现位置在位掩码中按对应关系所对应的位被置1,而其它位置0,所有字符的位掩码存储于位掩码表B中; b)对文本的预处理拷贝模式串至文本串尾部之后,形成越界保护带; c)根据匹配条件判定最佳的匹配动作选择Scan Loop中的循环展开字符个数和Match Loop的最佳实现方式; 所述的搜索由以下三个步骤循环实现 d)Scan Loop记循环展开字符数为q,由步骤c)确定,位向量生成的过程为以下q个值进行按位与操作得到窗口最末字符的位掩码左移q-1位、窗口倒数第二个字符的位掩码左移q-2位...窗口倒数第q个字符的位掩码,如果位向量为0,则窗口跳跃m-q+1个字符,重复本步骤,否则,转步骤e); e)Match Loop根据步骤c)中确定的最佳Match Loop实现方式自后向前读入字符,并检查已读入字符串是否是模式的子串;其方法是从窗口倒数第q+1个字符起,逐个读入字符并更新位向量直至位向量为0为止,之后转步骤f);该循环中使用Scan Loop所生成的位向量,在每个字符读入时,通过位向量与读入字符的位掩码进行位与操作和左移操作的方法更新位向量; f)后续判定动作利用如下条件判定是否发生模式匹配若窗口中已读入字符个数小于等于m+1(Match Loop选择6OP版本)或窗口中已读入字符未超过窗口首字符的前一个字符所在位置(MatchLoop选择5OP版本),则说明未发生模式匹配,产生一个跳跃,使窗口首字符跳跃至最后读入的字符之后,转步骤c);反之则先判断是否出现下标越界;如果未发生越界则说明发生模式匹配,报告匹配位置,并产生一个跳跃(其跳跃距离已在步骤a)中得出),跳跃完成后转步骤c);如发现下标越界则整个匹配过程结束,退出匹配程序。
本发明技术方案突出的实质性特点与显著的进步主要在于 1、在SBNDM2的Scan Loop中引入更灵活的循环展开机制,可以根据具体匹配要求选择最优循环展开的字符数。
2、通过将位掩码中有效位移至高位的方法,使得在Match Loop中,当待读入字符超出窗口边界时,通过位向量中被设置的位自动溢出而正确退出循环,致使每读入一个字符时都可以减少一次分支操作。本发明中提出两个Match Loop的版本,其中5op版本已达到该循环理论上最简形式。
3、引入了一种利用越界保护机制对字符串匹配进行加速的方法,降低了下标越界检查对性能的影响。
相对于现有技术,本发明所述方法适用范围广泛,性能较高。为验证本发明具体性能,对比试验相关数据如下 实验平台为INTEL Pentium E2160 OC 2.7GHz/2G(单通道)/gcc 3.4.2(-O3编译)。待匹配文本为E.coli DNA序列(Escherichia coli K-12 MG1655,4,639,221bp),Holy-bible.txt(4.22MB)和SARS病毒蛋白质序列(为便于比较复制到4.4MB)。对每种模式长度,本实验在文本中随机抽取100个串为实验样本。实验中只对匹配过程进行计时。为避免磁盘影响试验结果,实验前将所有文本读入内存中。使用RDTSC指令进行计时(误差为50系统时钟,精度较高)。实验数据为各算法匹配速度,单位GB/s。
选取以下算法作为对比算法,这些算法均为目前最为常用的算法或匹配性能最高的算法 1、基本的暴力匹配算法(BF)。
2、Horspool算法(HORS,1980年提出)。
3、Tuned BM算法(TBM,1991年提出)。
4、SBNDM算法(SBNDM,2001年提出)。
5、SSABS算法(SSABS,2004年提出)。
6、NEW算法(NEW3,2007年提出)。
7、SBNDM2算法(SBNDM2,2005年提出)。
对比实验数据如下 表1DNA序列语料中各模式长度下的匹配速度,单位GB/s 表2英文语料中各模式长度下的匹配速度,单位GB/s 表3蛋白质序列语料中各模式长度下的匹配速度,单位GB/s 实验结果显示,在模式长度小于机器字长时,在DNA序列,蛋白质序列和英文文本等常见语料上,该发明所述方法针对各种长度的模式,均表现出较高的性能,适用范围广泛。


图1本发明使用的位掩码定义关系图; 图2SBNDM2使用的位掩码定义关系图; 图3本发明整体流程图; 图4对模式进行预处理阶段流程图; 图5循环展开字符为2,6op版本Match Loop的匹配过程流程图; 图6循环展开字符为3,5op版本Match Loop的匹配过程流程。
具体实施例方式 下面结合附图举例对本发明做更详细地描述 本发明所述的一种高速位并行串匹配的方法,包含两个阶段预处理和搜索。
一、预处理为进行匹配进行的准备性工作。主要包含如下三个步骤 a)对模式的预处理该过程用以生成字母表中所有字符的位掩码。本步骤中首先给定一种字符在模式中出现位置和位掩码中的位的一种对应关系。然后对于字符集中的每个字符生成其对应位掩码(位掩码为一个无符号整数),其生成方法如下若该字符在模式中出现,则位掩码中该字符在模式中每个出现位置在位掩码中按对应关系所对应的位被置1,而其它位置0。按此方法生成字母表中所有字符的位掩码,并存储于位掩码表B中。本发明中使用的对应关系为模式中第i位与位掩码中的第(机器字长-1-i)位相对应,该对应关系如附图1所示。相对于SBNDM2的有效位在位掩码的低位(如附图2所示),而本发明选择有效位的位置在位掩码的高位,其目的是为简化Match Loop提供可能。同时,本阶段中还要计算发生模式匹配后的跳跃距离,该距离的值为模式长度减模式最长相同前后缀的长度。
b)对文本的预处理该过程用以生成下标越界保护带,其目的为减少下标越界检查的次数。其步骤为拷贝模式串至文本串尾部之后,形成越界保护带。这样在发生下标越界的情况下,必然出现一次模式匹配。因此,匹配过程中只需在发生模式匹配后的输出动作中检查是否下标越界即可。而在整个匹配过程中,发生模式匹配的概率较低,这样操作可有效降低下标越界检查的次数,提高算法性能。
c)根据匹配条件判定最佳的匹配动作本过程用于选择Scan Loop中的循环展开字符个数和Match Loop的最佳实现方式以得到更好的匹配性能。在各种语料下,性能最优的组合如下 表1.不同模式长度时,最优的组合方式(DNA序列) 表2.不同模式长度时,最优的组合方式(英文文本) 表3.不同模式长度时,最优的组合方式(蛋白质序列) 网络流量字符集相对略大于英文文本的字符集,可以参考蛋白质序列的选择,实验结果也显示,随机截取的网络流量与蛋白质序列的表现接近。其它字符集上的最优组合无法一一列出,可以通过简单的实验得到。
本步骤中相关数据由Intel Pentium E2160/2G DDR2 RAM/gcc 3.4.2最大优化(-O3)平台上经实验得出,在其它平台上可能会存在变化。根据本发明提供技术,可通过简单实验确定在其它平台上最优的组合方式,修改此数据所生成的其它技术方案亦属于本发明保护范畴。
二、搜索本过程用于在文本中搜索模式的所有出现。由以下三个步骤循环实现 d)Scan Loop本步骤用以生成窗口的初始位向量,采用窗口末端多个字符循环展开的方式实现。这里记循环展开字符数为q,由步骤c)确定。位向量生成的过程为以下q个值进行按位与操作得到窗口最末字符的位掩码左移q-1位、窗口倒数第二个字符的位掩码左移q-2位...窗口倒数第q个字符的位掩码。如果位向量为0,则窗口跳跃m-q+1个字符,重复本步骤,否则,转步骤e)。此步骤相对于SBNDM2相关步骤的主要改进在于,本发明所述方法引入了下标越界保护机制,因此在这里无需任何下标检查操作;并且针对不同的匹配条件使用了更灵活、更合理的循环展开字符数. e)Match Loop根据步骤c)中确定的最佳Match Loop实现方式自后向前读入字符,并检查已读入字符串是否是模式的子串。其方法是从窗口倒数第q+1个字符起,逐个读入字符并利用位并行机制更新位向量直至位向量为0为止,之后转步骤f)。本发明本部分相对于SBNDM2的主要特征是,在每读入一个字符时,无需检查已读入字符是否超出窗口的边界。Match Loop有两种实现方式,方式1为6op(6个基本操作每字符读入)版本,只去掉了SBNDM2相关循环中判定待读入字符是否超出窗口边界的检查,但仍需要维持一个临时变量记录已读入的字符总数;方式2为5op(5个基本操作每字符读入)版本,在6op版本基础上去掉了记录读入字符总数的操作,但在进入Match Loop循环前计算窗口首字符的所在位置。此步骤相对SBNDM2相应步骤改进的主要特征是,SBNDM2在此步骤需要7个操作每字符读入,而本发明对其简化,特别是5op版本,已经达到了此步骤理论上的最简形式。
f)后续判定动作判定是否发生模式匹配和下标越界。本步骤中利用如下条件判定是否发生模式匹配若Match Loop 6op版本中已读入字符个数小于等于模式长度+1或5op版本中待读入字符未超过窗口首字符的前一个字符所在位置,则说明未发生模式匹配;反之则应该报告发现模式匹配,发现位置为最后读入字符的下一个字符所在位置。如果没发生模式匹配,则产生一个跳跃,使窗口首字符跳跃至最后读入的字符之后,然后转步骤c)。反之,则先判断是否出现下标越界。如果未发生越界则说明发生模式匹配,报告匹配位置,并产生一个跳跃,跳跃距离已在步骤a)中得出转步骤c);如发现下标越界则整个匹配过程结束,退出匹配程序。此步骤相对于SBNDM2的主要特征在于将下标越界检查移动到本步骤中,使得下标越界检查的动作由每次跳跃执行一次减少到每发现模式匹配后才执行一次。
本发明完整实施步骤如下,涉及代码均为C/C++代码 a)生成位掩码表。
1)若待匹配文本为DNA序列,蛋白质序列,英文文本,则声明长为256的无符号整形数组B;若待匹配文本字符集容量大于256,则声明长为字符集容量的无符号整形数组B。B中所有元素都被置0。
2)记模式P长为m,机器字长ws(m<ws)。生成初始无符号整数变量k,其中只有第ws-m-1位被设置,其它位均被置0。
3)从模式最末字符开始逐个字符读入P中字符以生成位掩码表,其实现方法为由窗口最末字符开始每自后向前读入一个字符后(j=m-1),B[P[j]]与变量k进行按位或操作,其值存储于B[P[j]]中,然后k左移一位,j的值减1。
4)生成确定模式匹配后的跳跃距离,设P中最长的相同前后缀长为s,则在确定模式匹配后的跳跃距离为m-s。
b)设置越界保护带 5)拷贝模式串至文本串尾部之后,形成越界保护带。如果应用中存在一定的限制,无法操作文本串后的位置,则将文本串最末m个字符拷贝至临时串,然后,拷贝模式串至文本串尾部。在所有匹配动作完成之后,再将临时串拷贝回原来位置,并只匹配最末2*m-1个字符中是否出现模式。
c)判定最佳匹配方法 6)若待匹配文本为英文文本,模式长度为2-12时,转匹配方法一(步骤7);若带匹配文本为英文文本,模式长度为13-31时,转匹配方法二(步骤13);若待匹配文本为蛋白质序列,模式长度为2-16时,转匹配方法一(步骤7);若待匹配文本为蛋白质序列,模式长度为17-31时,转匹配方法二(步骤13);若待匹配文本为DNA序列,长度为3-9时,转匹配方法三(步骤19);若待匹配文本为DNA序列,长度为10-19时,转匹配方法四(步骤25);若待匹配文本为DNA序列,长度为20-31时,转匹配方法五(步骤31)。
d)进行具体匹配过程 匹配方法一 7)设窗口的最末字符为T[pos],设置无符号整形位向量D的值为以下两个值做按位与操作的结果这两个值分别为B[T[pos-1]];B[T[pos]]<<1。
8)若D的值不为0,则窗口跳跃m-1个字符后转步骤7。
9)令变量j的值为m-2。pos值减2。D左移一位。然后D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。
10)若D不为0,则进行以下操作D左移一位,j减1,pos减1,D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。然后转步骤10。
11)如果j为0,则先判断是否发生越界。如果没有下标越界,则说明已经发生模式匹配。报告匹配发生位置pos+1后,pos加上确定模式匹配后的跳跃距离后转步骤12。若判定发生越界,则退出匹配程序,匹配过程结束。
12)pos的值加上m后转步骤7。
匹配方法二 13)设置无符号整形位向量的D的值为以下三个值做按位与操作的结果这三个值分别为B[T[pos-2]];B[T[pos-1]]<<1;B[T[pos]]<<2。
14)若D的值不为0,则窗口跳跃m-2个字符后转步骤13. 15)令变量pos1的值为pos-m。变量pos的值减3。D左移一位。然后D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。
16)若D不为0,则进行以下操作D左移一位,pos减1,D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。然后转步骤16。
17)如果pos的值等于pos1,则先判断是否发生越界。如果没有下标越界,则说明已经发生模式匹配。报告匹配发生位置pos+1后,pos加上确定模式匹配后的跳跃距离后转步骤18。若判定发生越界,则退出匹配程序,匹配过程结束。
18)pos的值加上m后转步骤13。
匹配方法三 19)设置无符号整形位向量的D的值为以下三个值做按位与操作的结果,这三个值分别为B[T[pos-2]];B[T[pos-1]]<<1;B[T[pos]]<<2。
20)若D的值不为0,则窗口跳跃m-2个字符后转步骤19。
21)令变量j的值为m-3。pos值减3。D左移一位。然后D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。
22)若D不为0,则进行以下操作D左移一位,j减1,pos减1,D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。然后转步骤22。
23)如果j为0,则先判断是否发生越界。如果没有下标越界,则说明已经发生模式匹配。输出匹配发生位置pos+1后,pos加上确定模式匹配后的跳跃距离后转步骤24。若判定发生越界,则退出匹配程序,匹配过程结束。
24)pos的值加上m后转步骤19。
匹配方法四 25)设置无符号整形位向量的D的值为以下四个值做按位与操作的结果,这四个值分别为B[T[pos-3]];B[T[pos-2]]<<1;B[T[pos-1]]<<2;B[T[pos]]<<3。
26)若D的值不为0,则窗口跳跃m-3个字符后转步骤25。
27)令变量pos1的值为pos-m。变量pos的值减4。D左移一位。然后D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。
28)若D不为0,则进行以下操作D左移一位,pos减1,D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。然后转步骤28。
29)如果pos的值等于pos1,则先判断是否发生越界。如果没有下标越界,则说明已经发生模式匹配。报告匹配发生位置pos+1后,pos加上确定模式匹配后的跳跃距离后转步骤30。若判定发生越界,则退出匹配程序,匹配过程结束。
30)pos的值加上m后转步骤25。
匹配方法五 31)设置无符号整形位向量的D的值为以下五个值做按位与操作的结果,这五个值分别为B[T[pos-4]];B[T[pos-3]]<<1;B[T[pos-2]]<<2;B[T[pos-1]]<<3;B[T[pos]]<<4。
32)若D的值不为0,则窗口跳跃m-4个字符后转步骤31。
33)令变量j的值为m-5。pos值减5。D左移一位。然后D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。
34)若D不为0,则进行以下操作D左移一位,j减1,pos减1,D和T[pos]对应位掩码进行按位与操作,其结果存储于D中。然后转步骤34。
35)如果j为0,则先判断是否发生越界。如果没有下标越界,则说明已经发生模式匹配。报告匹配发生位置pos+1后,pos加上确定模式匹配后的跳跃距离后转步骤36。若判定发生越界,则退出匹配程序,匹配过程结束。
36)pos的值加上m后转步骤31。
实施的具体C代码如下,这里没有给出文件操作、输入输出、错误处理等相关代码,本领域研究人员可以自由选择需要的功能自行添加 //预处理部分,本实验中五个具体匹配方法的预处理部分一致。
unsigned int B[ASIZE];//ASIZE为欲申请的B表大小 memset(B,0,ASIZE*sizeof(int)); unsigned int k=1<<(ws-1-m); 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<m-1))j++;int matchshift=m-j; int pos=m-1;unsigned int D;int matchtime=0; memset(T+n,P,m); //根据文本和模式长度选择匹配部分的方法,代码略。
//匹配方法一 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);} j=m-2;D<<=1;pos-=2;D&=B[T[pos]]; while(D){D<<=1;j--;pos--;D&=B[T[pos]];} if(j==0) {if(pos<n-m){matchtime++;OUTPUT(pos+1);pos+=matchshift;}else return(matchtime);} pos+=m; } //匹配方法二 while(1) {D=B[t[pos-2]]&(B[t[pos-1]]<<1)&(B[t[pos]]<<2); while(D==0) {pos+=m-2;D=B[t[pos-2]]&(B[t[pos-1]]<<1)&(B[t[pos]]<<2);} D<<=1;pos 1=pos-m;pos-=3;D&=B[t[pos]]; while(D){pos--;D<<=1;D&=B[t[pos]];} if(pos==pos1){if(pos<n-m){matchtime++;OUTPUT(pos+1);pos+=matchshift;} else return(matchtime);} pos+=m; } //匹配方法三 while(1) {D=B[t[pos-2]]&(B[t[pos-1]]<<1)&(B[t[pos]]<<2); while(D==0) {pos+=m-2;D=B[t[pos-2]]&(B[t[pos-1]]<<1)&(B[t[pos]]<<2);} D<<=1;pos-=3;j=m-3;D&=B[t[pos]]; while(D){D<<=1;j--;pos--;D&=B[t[pos]];} if(j==0){if(pos<n-m){matchtime++;OUTPUT(pos+1);pos+=matchshift;} else return(matchtime);} pos+=m; } //匹配方法四 while(1) { D=B[t[pos-3]]&(B[t[pos-2]]<<1)&(B[t[pos-1]]<<2)&(B[t[pos]]<<3);while(D==0) {pos+=m-3; D=B[t[pos-3]]&(B[t[pos-2]]<<1)&(B[t[pos-1]]<<2)&(B[t[pos]]<<3); }D<<=1;pos 1=pos-m;pos-=4;D&=B[t[pos]];while(D){D<<=1;pos--;MS&=B[t[pos]];}if(pos==pos1) {if(pos<n-m){matchtime++;OUTPUT(pos+1);pos+=matchshift;}else return(matchtime);}pos+=m; } //匹配方法五 while(1) {D=B[t[pos-4]]&(B[t[pos-3]]<<1)&(B[t[pos-2]]<<2)&(B[t[pos-1]]<<3)&(B[t[pos]]<<4); while(D==0) {pos+=m-4; D=B[t[pos-4]]&(B[t[pos-3]]<<1)&(B[t[pos-2]]<<2)&(B[t[pos-1]]<<3)&(B[t[pos]]<<4); } D<<=1;pos-=5;j=m-5;D&=B[t[pos]]; while(D){MS<<=1;j--;pos--;MS&=B[t[pos]];} if(j==0){if(pos<n-m){matchtime++;OUTPUT(pos+1);pos+=matchshift;}else return(matchtime);} pos+=m; } 。
权利要求
1、一种高速精确单模式字符串匹配的方法,包含预处理和搜索;其特征是所述的预处理主要包含如下三个步骤
a)对模式的预处理首先给定一种字符在模式中出现位置和位掩码中的位的一种对应关系,然后对于字符集中的每个字符生成其对应位掩码,位掩码为一个无符号整数,若该字符在模式中出现,则位掩码中该字符在模式中每个出现位置在位掩码中按对应关系所对应的位被置1,而其它位置0,所有字符的位掩码存储于位掩码表B中;
b)对文本的预处理拷贝模式串至文本串尾部之后,形成越界保护带;
c)根据匹配条件判定最佳的匹配动作选择Scan Loop中的循环展开字符个数和Match Loop的最佳实现方式;
所述的搜索由以下三个步骤循环实现
d)Scan Loop记循环展开字符数为q,由步骤c)确定,位向量生成的过程为以下q个值进行按位与操作得到窗口最末字符的位掩码左移q-1位、窗口倒数第二个字符的位掩码左移q-2位...窗口倒数第q个字符的位掩码,如果位向量为0,则窗口跳跃m-q+1个字符,重复本步骤,否则,转步骤e);
e)Match Loop根据步骤c)中确定的最佳Match Loop实现方式自后向前读入字符,并检查已读入字符串是否是模式的子串;其方法是从窗口倒数第q+1个字符起,逐个读入字符并更新位向量直至位向量为0为止,之后转步骤f);该循环中使用Scan Loop所生成的位向量,在每个字符读入时,通过位向量与读入字符的位掩码进行位与操作和左移操作的方法更新位向量;
f)后续判定动作确认是否发生模式匹配,并在发现模式匹配后,检查是否出现下标越界。
全文摘要
本发明提供的是一种高速精确单模式字符串匹配的方法,包含预处理和搜索两个阶段。其中预处理阶段包括对模式的预处理、对文本的预处理和根据匹配条件判定最佳的匹配动作,共三个主要步骤,搜索阶段为进行串匹配的过程,包括Scan Loop、Match Loop和后续判定动作,共三个主要步骤。本发明在目前英文语料上进行匹配时最高速的方法之一的SBNDM2算法基础上进行如下改进通过引入下标越界保护机制减少了下标越界检查的开销;通过修改位掩码与位向量定义的方式简化了算法;并通过扩展SBNDM2的循环展开机制,确定了一种对于不同模式长度和不同语料选择最优的循环展开字符的方法,提高算法针对不同匹配条件时的匹配性能。本发明所述方法是在模式长度不超过机器字长时的一种性能高,适用范围广泛的高速位并行精确单模式串匹配方法。
文档编号G06F17/30GK101609455SQ20091007246
公开日2009年12月23日 申请日期2009年7月7日 优先权日2009年7月7日
发明者姚念民, 范洪博 申请人:哈尔滨工程大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1