專利名稱:一種高速精確單模式字符串匹配的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及信息處理領(lǐng)域中一種用于提高處理文本數(shù)據(jù)搜索性能的方法,具體地說(shuō)是一種精確單模式字符串匹配的方法。
背景技術(shù):
字符串匹配問題指在給定符號(hào)序列中找出具有某種性質(zhì)的符號(hào)子序列的問題。字符串匹配問題是計(jì)算機(jī)科學(xué)的基本問題之一,其應(yīng)用范圍極其廣泛。在幾乎所有涉及文本處理的領(lǐng)域或者可以規(guī)劃為文本處理的領(lǐng)域中均包含字符串匹配的相關(guān)要求(如搜索引擎、語(yǔ)言翻譯、OCR識(shí)別、拼寫檢查等領(lǐng)域)。特別是在入侵檢測(cè)/病毒檢測(cè)、網(wǎng)絡(luò)信息過濾與檢索、計(jì)算生物學(xué)/生物信息學(xué)等重要領(lǐng)域中,字符串匹配問題已經(jīng)成為這些領(lǐng)域的核心問題。但目前,字符串匹配技術(shù)的發(fā)展落后于計(jì)算機(jī)硬件、計(jì)算機(jī)網(wǎng)絡(luò)的發(fā)展,現(xiàn)有字符串匹配方法難以滿足應(yīng)用程序?qū)Υヅ湫阅艿男枰址ヅ涞乃俣纫呀?jīng)成為決定字符串匹配類應(yīng)用軟件性能的瓶頸與關(guān)鍵。
在字符串匹配領(lǐng)域的各類問題中,精確單模式串匹配問題為字符串匹配領(lǐng)域各類問題的基礎(chǔ)。而且精確單模式匹配本身的應(yīng)用也最為廣泛。因此,在字符串匹配領(lǐng)域中,提出一種更高速的精確單模式串匹配方法有特別重要的意義。目前有案可查的進(jìn)行精確單模式匹配的方法有上百種。
在實(shí)際匹配中,在英文語(yǔ)料(或ASCII字符集)中進(jìn)行檢索最為常見,同時(shí)待匹配的模式也很少見到超過32(目前32位計(jì)算機(jī)的機(jī)器字長(zhǎng))的,在此條件下,截止至本專利申請(qǐng)時(shí),目前最高速的精確單模式匹配方法之一為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算法隸屬于采用子串匹配機(jī)制和位并行機(jī)制完成搜索的BNDM類算法。若能在SBNDM2算法的基礎(chǔ)上,針對(duì)其不足進(jìn)行改進(jìn),有可能獲得更高性能的精確單模式串匹配的方法。
SBNDM2算法在匹配過程中維護(hù)了一個(gè)位向量,該位向量中被設(shè)置的位記錄了已讀入字符串的所有出現(xiàn)位置,根據(jù)此位向量能夠快速判斷已讀入字符串是否為模式的子串,算法利用此結(jié)果實(shí)現(xiàn)模式匹配。算法匹配時(shí)從滑動(dòng)窗口尾部反向讀入字符。如果已讀入字符串為模式的子串,則可以繼續(xù)從窗口中反向讀入字符直到發(fā)現(xiàn)模式匹配(即已讀入字符長(zhǎng)度與模式等長(zhǎng));否則,將產(chǎn)生一個(gè)跳躍,將窗口首字符與發(fā)現(xiàn)的模式最長(zhǎng)子串首字符對(duì)齊。
SBNDM2包含預(yù)處理和搜索兩個(gè)主要階段。為實(shí)現(xiàn)利用位并行機(jī)制進(jìn)行字符串匹配,SBNDM2的預(yù)處理階段生成字符集中每個(gè)字符的位掩碼(以無(wú)符號(hào)整數(shù)形式存儲(chǔ)),掩碼記錄了該字符在模式的所有出現(xiàn)位置。SBNDM2將匹配的過程分裂為兩個(gè)相對(duì)獨(dú)立的循環(huán)。內(nèi)層循環(huán)(稱Scan Loop)一次讀入窗口最末的2個(gè)字符,然后利用已讀入字符的位掩碼生成位向量,并檢查這兩個(gè)字符是否是模式的子串。若已讀入的兩個(gè)字符不是模式的子串,則跳躍(模式長(zhǎng)度-1)個(gè)字符,并重復(fù)Scan Loop;反之,則進(jìn)入外層循環(huán)(稱Match Loop)。外層循環(huán)在窗口內(nèi)繼續(xù)自后向前逐個(gè)讀入字符,每讀入一個(gè)字符就利用該字符的位掩碼更新位向量,并根據(jù)更新后的位向量檢查已讀入字符串是否是模式的子串,直到發(fā)現(xiàn)某字符讀入后不再是模式的子串為止,然后跳躍窗口首字符至該字符之后,重新進(jìn)入Scan Loop。若窗口首字符讀入后,已讀入字符串仍然是模式的子串,則說(shuō)明發(fā)生了模式匹配。SBNDM2算法的具體實(shí)現(xiàn)參見附錄1。
SBNDM2算法存在如下幾點(diǎn)不足 1)在Match Loop中,SBNDM2算法在每讀入一個(gè)字符時(shí)需要7條具體操作,其中兩條分支操作。理論上,Match Loop中完成一次字符讀入只需要5項(xiàng)操作,其中分支指令1條,不過至今尚未有能達(dá)到此最簡(jiǎn)形式的算法出現(xiàn)。如果能簡(jiǎn)化Match Loop到5條指令,其中分支指令1條的最簡(jiǎn)形式,將能有效提高算法性能。
2)在SBNDM2算法中,在每次跳躍的過程中都必須進(jìn)行一次下標(biāo)越界的檢查以確定待讀入字符是否已經(jīng)超出文本的邊界。由于一般待匹配的文本都比較大,出現(xiàn)下標(biāo)越界的概率很小,如此頻繁的下標(biāo)越界檢查將降低算法的性能。
3)雖然Scan Loop和Match Loop都能實(shí)現(xiàn)跳躍,但SBNDM2算法性能主要受Scan Loop的影響。在Scan Loop中,SBNDM2算法只使用兩個(gè)字符進(jìn)行循環(huán)展開,過于刻板,應(yīng)該根據(jù)匹配條件(如字符集大小,模式長(zhǎng)度)來(lái)判斷進(jìn)行循環(huán)展開的字符總數(shù)。
如能針對(duì)該算法以上不足進(jìn)行改進(jìn),將有可能得到性能更高的精確單模式串匹配算法。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種速度更高、適用范圍更廣泛的一種高速精確單模式字符串匹配的方法。本說(shuō)明書中,記文本T長(zhǎng)度為n,模式P長(zhǎng)度為m。
本發(fā)明的目的是這樣實(shí)現(xiàn)的 包含預(yù)處理和搜索; 所述的預(yù)處理主要包含如下三個(gè)步驟 a)對(duì)模式的預(yù)處理首先給定一種字符在模式中出現(xiàn)位置和位掩碼中的位的一種對(duì)應(yīng)關(guān)系,然后對(duì)于字符集中的每個(gè)字符生成其對(duì)應(yīng)位掩碼,位掩碼為一個(gè)無(wú)符號(hào)整數(shù),若該字符在模式中出現(xiàn),則位掩碼中該字符在模式中每個(gè)出現(xiàn)位置在位掩碼中按對(duì)應(yīng)關(guān)系所對(duì)應(yīng)的位被置1,而其它位置0,所有字符的位掩碼存儲(chǔ)于位掩碼表B中; b)對(duì)文本的預(yù)處理拷貝模式串至文本串尾部之后,形成越界保護(hù)帶; c)根據(jù)匹配條件判定最佳的匹配動(dòng)作選擇Scan Loop中的循環(huán)展開字符個(gè)數(shù)和Match Loop的最佳實(shí)現(xiàn)方式; 所述的搜索由以下三個(gè)步驟循環(huán)實(shí)現(xiàn) d)Scan Loop記循環(huán)展開字符數(shù)為q,由步驟c)確定,位向量生成的過程為以下q個(gè)值進(jìn)行按位與操作得到窗口最末字符的位掩碼左移q-1位、窗口倒數(shù)第二個(gè)字符的位掩碼左移q-2位...窗口倒數(shù)第q個(gè)字符的位掩碼,如果位向量為0,則窗口跳躍m-q+1個(gè)字符,重復(fù)本步驟,否則,轉(zhuǎn)步驟e); e)Match Loop根據(jù)步驟c)中確定的最佳Match Loop實(shí)現(xiàn)方式自后向前讀入字符,并檢查已讀入字符串是否是模式的子串;其方法是從窗口倒數(shù)第q+1個(gè)字符起,逐個(gè)讀入字符并更新位向量直至位向量為0為止,之后轉(zhuǎn)步驟f);該循環(huán)中使用Scan Loop所生成的位向量,在每個(gè)字符讀入時(shí),通過位向量與讀入字符的位掩碼進(jìn)行位與操作和左移操作的方法更新位向量; f)后續(xù)判定動(dòng)作利用如下條件判定是否發(fā)生模式匹配若窗口中已讀入字符個(gè)數(shù)小于等于m+1(Match Loop選擇6OP版本)或窗口中已讀入字符未超過窗口首字符的前一個(gè)字符所在位置(MatchLoop選擇5OP版本),則說(shuō)明未發(fā)生模式匹配,產(chǎn)生一個(gè)跳躍,使窗口首字符跳躍至最后讀入的字符之后,轉(zhuǎn)步驟c);反之則先判斷是否出現(xiàn)下標(biāo)越界;如果未發(fā)生越界則說(shuō)明發(fā)生模式匹配,報(bào)告匹配位置,并產(chǎn)生一個(gè)跳躍(其跳躍距離已在步驟a)中得出),跳躍完成后轉(zhuǎn)步驟c);如發(fā)現(xiàn)下標(biāo)越界則整個(gè)匹配過程結(jié)束,退出匹配程序。
本發(fā)明技術(shù)方案突出的實(shí)質(zhì)性特點(diǎn)與顯著的進(jìn)步主要在于 1、在SBNDM2的Scan Loop中引入更靈活的循環(huán)展開機(jī)制,可以根據(jù)具體匹配要求選擇最優(yōu)循環(huán)展開的字符數(shù)。
2、通過將位掩碼中有效位移至高位的方法,使得在Match Loop中,當(dāng)待讀入字符超出窗口邊界時(shí),通過位向量中被設(shè)置的位自動(dòng)溢出而正確退出循環(huán),致使每讀入一個(gè)字符時(shí)都可以減少一次分支操作。本發(fā)明中提出兩個(gè)Match Loop的版本,其中5op版本已達(dá)到該循環(huán)理論上最簡(jiǎn)形式。
3、引入了一種利用越界保護(hù)機(jī)制對(duì)字符串匹配進(jìn)行加速的方法,降低了下標(biāo)越界檢查對(duì)性能的影響。
相對(duì)于現(xiàn)有技術(shù),本發(fā)明所述方法適用范圍廣泛,性能較高。為驗(yàn)證本發(fā)明具體性能,對(duì)比試驗(yàn)相關(guān)數(shù)據(jù)如下 實(shí)驗(yàn)平臺(tái)為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病毒蛋白質(zhì)序列(為便于比較復(fù)制到4.4MB)。對(duì)每種模式長(zhǎng)度,本實(shí)驗(yàn)在文本中隨機(jī)抽取100個(gè)串為實(shí)驗(yàn)樣本。實(shí)驗(yàn)中只對(duì)匹配過程進(jìn)行計(jì)時(shí)。為避免磁盤影響試驗(yàn)結(jié)果,實(shí)驗(yàn)前將所有文本讀入內(nèi)存中。使用RDTSC指令進(jìn)行計(jì)時(shí)(誤差為50系統(tǒng)時(shí)鐘,精度較高)。實(shí)驗(yàn)數(shù)據(jù)為各算法匹配速度,單位GB/s。
選取以下算法作為對(duì)比算法,這些算法均為目前最為常用的算法或匹配性能最高的算法 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年提出)。
對(duì)比實(shí)驗(yàn)數(shù)據(jù)如下 表1DNA序列語(yǔ)料中各模式長(zhǎng)度下的匹配速度,單位GB/s 表2英文語(yǔ)料中各模式長(zhǎng)度下的匹配速度,單位GB/s 表3蛋白質(zhì)序列語(yǔ)料中各模式長(zhǎng)度下的匹配速度,單位GB/s 實(shí)驗(yàn)結(jié)果顯示,在模式長(zhǎng)度小于機(jī)器字長(zhǎng)時(shí),在DNA序列,蛋白質(zhì)序列和英文文本等常見語(yǔ)料上,該發(fā)明所述方法針對(duì)各種長(zhǎng)度的模式,均表現(xiàn)出較高的性能,適用范圍廣泛。
圖1本發(fā)明使用的位掩碼定義關(guān)系圖; 圖2SBNDM2使用的位掩碼定義關(guān)系圖; 圖3本發(fā)明整體流程圖; 圖4對(duì)模式進(jìn)行預(yù)處理階段流程圖; 圖5循環(huán)展開字符為2,6op版本Match Loop的匹配過程流程圖; 圖6循環(huán)展開字符為3,5op版本Match Loop的匹配過程流程。
具體實(shí)施例方式 下面結(jié)合附圖舉例對(duì)本發(fā)明做更詳細(xì)地描述 本發(fā)明所述的一種高速位并行串匹配的方法,包含兩個(gè)階段預(yù)處理和搜索。
一、預(yù)處理為進(jìn)行匹配進(jìn)行的準(zhǔn)備性工作。主要包含如下三個(gè)步驟 a)對(duì)模式的預(yù)處理該過程用以生成字母表中所有字符的位掩碼。本步驟中首先給定一種字符在模式中出現(xiàn)位置和位掩碼中的位的一種對(duì)應(yīng)關(guān)系。然后對(duì)于字符集中的每個(gè)字符生成其對(duì)應(yīng)位掩碼(位掩碼為一個(gè)無(wú)符號(hào)整數(shù)),其生成方法如下若該字符在模式中出現(xiàn),則位掩碼中該字符在模式中每個(gè)出現(xiàn)位置在位掩碼中按對(duì)應(yīng)關(guān)系所對(duì)應(yīng)的位被置1,而其它位置0。按此方法生成字母表中所有字符的位掩碼,并存儲(chǔ)于位掩碼表B中。本發(fā)明中使用的對(duì)應(yīng)關(guān)系為模式中第i位與位掩碼中的第(機(jī)器字長(zhǎng)-1-i)位相對(duì)應(yīng),該對(duì)應(yīng)關(guān)系如附圖1所示。相對(duì)于SBNDM2的有效位在位掩碼的低位(如附圖2所示),而本發(fā)明選擇有效位的位置在位掩碼的高位,其目的是為簡(jiǎn)化Match Loop提供可能。同時(shí),本階段中還要計(jì)算發(fā)生模式匹配后的跳躍距離,該距離的值為模式長(zhǎng)度減模式最長(zhǎng)相同前后綴的長(zhǎng)度。
b)對(duì)文本的預(yù)處理該過程用以生成下標(biāo)越界保護(hù)帶,其目的為減少下標(biāo)越界檢查的次數(shù)。其步驟為拷貝模式串至文本串尾部之后,形成越界保護(hù)帶。這樣在發(fā)生下標(biāo)越界的情況下,必然出現(xiàn)一次模式匹配。因此,匹配過程中只需在發(fā)生模式匹配后的輸出動(dòng)作中檢查是否下標(biāo)越界即可。而在整個(gè)匹配過程中,發(fā)生模式匹配的概率較低,這樣操作可有效降低下標(biāo)越界檢查的次數(shù),提高算法性能。
c)根據(jù)匹配條件判定最佳的匹配動(dòng)作本過程用于選擇Scan Loop中的循環(huán)展開字符個(gè)數(shù)和Match Loop的最佳實(shí)現(xiàn)方式以得到更好的匹配性能。在各種語(yǔ)料下,性能最優(yōu)的組合如下 表1.不同模式長(zhǎng)度時(shí),最優(yōu)的組合方式(DNA序列) 表2.不同模式長(zhǎng)度時(shí),最優(yōu)的組合方式(英文文本) 表3.不同模式長(zhǎng)度時(shí),最優(yōu)的組合方式(蛋白質(zhì)序列) 網(wǎng)絡(luò)流量字符集相對(duì)略大于英文文本的字符集,可以參考蛋白質(zhì)序列的選擇,實(shí)驗(yàn)結(jié)果也顯示,隨機(jī)截取的網(wǎng)絡(luò)流量與蛋白質(zhì)序列的表現(xiàn)接近。其它字符集上的最優(yōu)組合無(wú)法一一列出,可以通過簡(jiǎn)單的實(shí)驗(yàn)得到。
本步驟中相關(guān)數(shù)據(jù)由Intel Pentium E2160/2G DDR2 RAM/gcc 3.4.2最大優(yōu)化(-O3)平臺(tái)上經(jīng)實(shí)驗(yàn)得出,在其它平臺(tái)上可能會(huì)存在變化。根據(jù)本發(fā)明提供技術(shù),可通過簡(jiǎn)單實(shí)驗(yàn)確定在其它平臺(tái)上最優(yōu)的組合方式,修改此數(shù)據(jù)所生成的其它技術(shù)方案亦屬于本發(fā)明保護(hù)范疇。
二、搜索本過程用于在文本中搜索模式的所有出現(xiàn)。由以下三個(gè)步驟循環(huán)實(shí)現(xiàn) d)Scan Loop本步驟用以生成窗口的初始位向量,采用窗口末端多個(gè)字符循環(huán)展開的方式實(shí)現(xiàn)。這里記循環(huán)展開字符數(shù)為q,由步驟c)確定。位向量生成的過程為以下q個(gè)值進(jìn)行按位與操作得到窗口最末字符的位掩碼左移q-1位、窗口倒數(shù)第二個(gè)字符的位掩碼左移q-2位...窗口倒數(shù)第q個(gè)字符的位掩碼。如果位向量為0,則窗口跳躍m-q+1個(gè)字符,重復(fù)本步驟,否則,轉(zhuǎn)步驟e)。此步驟相對(duì)于SBNDM2相關(guān)步驟的主要改進(jìn)在于,本發(fā)明所述方法引入了下標(biāo)越界保護(hù)機(jī)制,因此在這里無(wú)需任何下標(biāo)檢查操作;并且針對(duì)不同的匹配條件使用了更靈活、更合理的循環(huán)展開字符數(shù). e)Match Loop根據(jù)步驟c)中確定的最佳Match Loop實(shí)現(xiàn)方式自后向前讀入字符,并檢查已讀入字符串是否是模式的子串。其方法是從窗口倒數(shù)第q+1個(gè)字符起,逐個(gè)讀入字符并利用位并行機(jī)制更新位向量直至位向量為0為止,之后轉(zhuǎn)步驟f)。本發(fā)明本部分相對(duì)于SBNDM2的主要特征是,在每讀入一個(gè)字符時(shí),無(wú)需檢查已讀入字符是否超出窗口的邊界。Match Loop有兩種實(shí)現(xiàn)方式,方式1為6op(6個(gè)基本操作每字符讀入)版本,只去掉了SBNDM2相關(guān)循環(huán)中判定待讀入字符是否超出窗口邊界的檢查,但仍需要維持一個(gè)臨時(shí)變量記錄已讀入的字符總數(shù);方式2為5op(5個(gè)基本操作每字符讀入)版本,在6op版本基礎(chǔ)上去掉了記錄讀入字符總數(shù)的操作,但在進(jìn)入Match Loop循環(huán)前計(jì)算窗口首字符的所在位置。此步驟相對(duì)SBNDM2相應(yīng)步驟改進(jìn)的主要特征是,SBNDM2在此步驟需要7個(gè)操作每字符讀入,而本發(fā)明對(duì)其簡(jiǎn)化,特別是5op版本,已經(jīng)達(dá)到了此步驟理論上的最簡(jiǎn)形式。
f)后續(xù)判定動(dòng)作判定是否發(fā)生模式匹配和下標(biāo)越界。本步驟中利用如下條件判定是否發(fā)生模式匹配若Match Loop 6op版本中已讀入字符個(gè)數(shù)小于等于模式長(zhǎng)度+1或5op版本中待讀入字符未超過窗口首字符的前一個(gè)字符所在位置,則說(shuō)明未發(fā)生模式匹配;反之則應(yīng)該報(bào)告發(fā)現(xiàn)模式匹配,發(fā)現(xiàn)位置為最后讀入字符的下一個(gè)字符所在位置。如果沒發(fā)生模式匹配,則產(chǎn)生一個(gè)跳躍,使窗口首字符跳躍至最后讀入的字符之后,然后轉(zhuǎn)步驟c)。反之,則先判斷是否出現(xiàn)下標(biāo)越界。如果未發(fā)生越界則說(shuō)明發(fā)生模式匹配,報(bào)告匹配位置,并產(chǎn)生一個(gè)跳躍,跳躍距離已在步驟a)中得出轉(zhuǎn)步驟c);如發(fā)現(xiàn)下標(biāo)越界則整個(gè)匹配過程結(jié)束,退出匹配程序。此步驟相對(duì)于SBNDM2的主要特征在于將下標(biāo)越界檢查移動(dòng)到本步驟中,使得下標(biāo)越界檢查的動(dòng)作由每次跳躍執(zhí)行一次減少到每發(fā)現(xiàn)模式匹配后才執(zhí)行一次。
本發(fā)明完整實(shí)施步驟如下,涉及代碼均為C/C++代碼 a)生成位掩碼表。
1)若待匹配文本為DNA序列,蛋白質(zhì)序列,英文文本,則聲明長(zhǎng)為256的無(wú)符號(hào)整形數(shù)組B;若待匹配文本字符集容量大于256,則聲明長(zhǎng)為字符集容量的無(wú)符號(hào)整形數(shù)組B。B中所有元素都被置0。
2)記模式P長(zhǎng)為m,機(jī)器字長(zhǎng)ws(m<ws)。生成初始無(wú)符號(hào)整數(shù)變量k,其中只有第ws-m-1位被設(shè)置,其它位均被置0。
3)從模式最末字符開始逐個(gè)字符讀入P中字符以生成位掩碼表,其實(shí)現(xiàn)方法為由窗口最末字符開始每自后向前讀入一個(gè)字符后(j=m-1),B[P[j]]與變量k進(jìn)行按位或操作,其值存儲(chǔ)于B[P[j]]中,然后k左移一位,j的值減1。
4)生成確定模式匹配后的跳躍距離,設(shè)P中最長(zhǎng)的相同前后綴長(zhǎng)為s,則在確定模式匹配后的跳躍距離為m-s。
b)設(shè)置越界保護(hù)帶 5)拷貝模式串至文本串尾部之后,形成越界保護(hù)帶。如果應(yīng)用中存在一定的限制,無(wú)法操作文本串后的位置,則將文本串最末m個(gè)字符拷貝至臨時(shí)串,然后,拷貝模式串至文本串尾部。在所有匹配動(dòng)作完成之后,再將臨時(shí)串拷貝回原來(lái)位置,并只匹配最末2*m-1個(gè)字符中是否出現(xiàn)模式。
c)判定最佳匹配方法 6)若待匹配文本為英文文本,模式長(zhǎng)度為2-12時(shí),轉(zhuǎn)匹配方法一(步驟7);若帶匹配文本為英文文本,模式長(zhǎng)度為13-31時(shí),轉(zhuǎn)匹配方法二(步驟13);若待匹配文本為蛋白質(zhì)序列,模式長(zhǎng)度為2-16時(shí),轉(zhuǎn)匹配方法一(步驟7);若待匹配文本為蛋白質(zhì)序列,模式長(zhǎng)度為17-31時(shí),轉(zhuǎn)匹配方法二(步驟13);若待匹配文本為DNA序列,長(zhǎng)度為3-9時(shí),轉(zhuǎn)匹配方法三(步驟19);若待匹配文本為DNA序列,長(zhǎng)度為10-19時(shí),轉(zhuǎn)匹配方法四(步驟25);若待匹配文本為DNA序列,長(zhǎng)度為20-31時(shí),轉(zhuǎn)匹配方法五(步驟31)。
d)進(jìn)行具體匹配過程 匹配方法一 7)設(shè)窗口的最末字符為T[pos],設(shè)置無(wú)符號(hào)整形位向量D的值為以下兩個(gè)值做按位與操作的結(jié)果這兩個(gè)值分別為B[T[pos-1]];B[T[pos]]<<1。
8)若D的值不為0,則窗口跳躍m-1個(gè)字符后轉(zhuǎn)步驟7。
9)令變量j的值為m-2。pos值減2。D左移一位。然后D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。
10)若D不為0,則進(jìn)行以下操作D左移一位,j減1,pos減1,D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。然后轉(zhuǎn)步驟10。
11)如果j為0,則先判斷是否發(fā)生越界。如果沒有下標(biāo)越界,則說(shuō)明已經(jīng)發(fā)生模式匹配。報(bào)告匹配發(fā)生位置pos+1后,pos加上確定模式匹配后的跳躍距離后轉(zhuǎn)步驟12。若判定發(fā)生越界,則退出匹配程序,匹配過程結(jié)束。
12)pos的值加上m后轉(zhuǎn)步驟7。
匹配方法二 13)設(shè)置無(wú)符號(hào)整形位向量的D的值為以下三個(gè)值做按位與操作的結(jié)果這三個(gè)值分別為B[T[pos-2]];B[T[pos-1]]<<1;B[T[pos]]<<2。
14)若D的值不為0,則窗口跳躍m-2個(gè)字符后轉(zhuǎn)步驟13. 15)令變量pos1的值為pos-m。變量pos的值減3。D左移一位。然后D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。
16)若D不為0,則進(jìn)行以下操作D左移一位,pos減1,D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。然后轉(zhuǎn)步驟16。
17)如果pos的值等于pos1,則先判斷是否發(fā)生越界。如果沒有下標(biāo)越界,則說(shuō)明已經(jīng)發(fā)生模式匹配。報(bào)告匹配發(fā)生位置pos+1后,pos加上確定模式匹配后的跳躍距離后轉(zhuǎn)步驟18。若判定發(fā)生越界,則退出匹配程序,匹配過程結(jié)束。
18)pos的值加上m后轉(zhuǎn)步驟13。
匹配方法三 19)設(shè)置無(wú)符號(hào)整形位向量的D的值為以下三個(gè)值做按位與操作的結(jié)果,這三個(gè)值分別為B[T[pos-2]];B[T[pos-1]]<<1;B[T[pos]]<<2。
20)若D的值不為0,則窗口跳躍m-2個(gè)字符后轉(zhuǎn)步驟19。
21)令變量j的值為m-3。pos值減3。D左移一位。然后D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。
22)若D不為0,則進(jìn)行以下操作D左移一位,j減1,pos減1,D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。然后轉(zhuǎn)步驟22。
23)如果j為0,則先判斷是否發(fā)生越界。如果沒有下標(biāo)越界,則說(shuō)明已經(jīng)發(fā)生模式匹配。輸出匹配發(fā)生位置pos+1后,pos加上確定模式匹配后的跳躍距離后轉(zhuǎn)步驟24。若判定發(fā)生越界,則退出匹配程序,匹配過程結(jié)束。
24)pos的值加上m后轉(zhuǎn)步驟19。
匹配方法四 25)設(shè)置無(wú)符號(hào)整形位向量的D的值為以下四個(gè)值做按位與操作的結(jié)果,這四個(gè)值分別為B[T[pos-3]];B[T[pos-2]]<<1;B[T[pos-1]]<<2;B[T[pos]]<<3。
26)若D的值不為0,則窗口跳躍m-3個(gè)字符后轉(zhuǎn)步驟25。
27)令變量pos1的值為pos-m。變量pos的值減4。D左移一位。然后D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。
28)若D不為0,則進(jìn)行以下操作D左移一位,pos減1,D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。然后轉(zhuǎn)步驟28。
29)如果pos的值等于pos1,則先判斷是否發(fā)生越界。如果沒有下標(biāo)越界,則說(shuō)明已經(jīng)發(fā)生模式匹配。報(bào)告匹配發(fā)生位置pos+1后,pos加上確定模式匹配后的跳躍距離后轉(zhuǎn)步驟30。若判定發(fā)生越界,則退出匹配程序,匹配過程結(jié)束。
30)pos的值加上m后轉(zhuǎn)步驟25。
匹配方法五 31)設(shè)置無(wú)符號(hào)整形位向量的D的值為以下五個(gè)值做按位與操作的結(jié)果,這五個(gè)值分別為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個(gè)字符后轉(zhuǎn)步驟31。
33)令變量j的值為m-5。pos值減5。D左移一位。然后D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。
34)若D不為0,則進(jìn)行以下操作D左移一位,j減1,pos減1,D和T[pos]對(duì)應(yīng)位掩碼進(jìn)行按位與操作,其結(jié)果存儲(chǔ)于D中。然后轉(zhuǎn)步驟34。
35)如果j為0,則先判斷是否發(fā)生越界。如果沒有下標(biāo)越界,則說(shuō)明已經(jīng)發(fā)生模式匹配。報(bào)告匹配發(fā)生位置pos+1后,pos加上確定模式匹配后的跳躍距離后轉(zhuǎn)步驟36。若判定發(fā)生越界,則退出匹配程序,匹配過程結(jié)束。
36)pos的值加上m后轉(zhuǎn)步驟31。
實(shí)施的具體C代碼如下,這里沒有給出文件操作、輸入輸出、錯(cuò)誤處理等相關(guān)代碼,本領(lǐng)域研究人員可以自由選擇需要的功能自行添加 //預(yù)處理部分,本實(shí)驗(yàn)中五個(gè)具體匹配方法的預(yù)處理部分一致。
unsigned int B[ASIZE];//ASIZE為欲申請(qǐng)的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); //根據(jù)文本和模式長(zhǎng)度選擇匹配部分的方法,代碼略。
//匹配方法一 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; } 。
權(quán)利要求
1、一種高速精確單模式字符串匹配的方法,包含預(yù)處理和搜索;其特征是所述的預(yù)處理主要包含如下三個(gè)步驟
a)對(duì)模式的預(yù)處理首先給定一種字符在模式中出現(xiàn)位置和位掩碼中的位的一種對(duì)應(yīng)關(guān)系,然后對(duì)于字符集中的每個(gè)字符生成其對(duì)應(yīng)位掩碼,位掩碼為一個(gè)無(wú)符號(hào)整數(shù),若該字符在模式中出現(xiàn),則位掩碼中該字符在模式中每個(gè)出現(xiàn)位置在位掩碼中按對(duì)應(yīng)關(guān)系所對(duì)應(yīng)的位被置1,而其它位置0,所有字符的位掩碼存儲(chǔ)于位掩碼表B中;
b)對(duì)文本的預(yù)處理拷貝模式串至文本串尾部之后,形成越界保護(hù)帶;
c)根據(jù)匹配條件判定最佳的匹配動(dòng)作選擇Scan Loop中的循環(huán)展開字符個(gè)數(shù)和Match Loop的最佳實(shí)現(xiàn)方式;
所述的搜索由以下三個(gè)步驟循環(huán)實(shí)現(xiàn)
d)Scan Loop記循環(huán)展開字符數(shù)為q,由步驟c)確定,位向量生成的過程為以下q個(gè)值進(jìn)行按位與操作得到窗口最末字符的位掩碼左移q-1位、窗口倒數(shù)第二個(gè)字符的位掩碼左移q-2位...窗口倒數(shù)第q個(gè)字符的位掩碼,如果位向量為0,則窗口跳躍m-q+1個(gè)字符,重復(fù)本步驟,否則,轉(zhuǎn)步驟e);
e)Match Loop根據(jù)步驟c)中確定的最佳Match Loop實(shí)現(xiàn)方式自后向前讀入字符,并檢查已讀入字符串是否是模式的子串;其方法是從窗口倒數(shù)第q+1個(gè)字符起,逐個(gè)讀入字符并更新位向量直至位向量為0為止,之后轉(zhuǎn)步驟f);該循環(huán)中使用Scan Loop所生成的位向量,在每個(gè)字符讀入時(shí),通過位向量與讀入字符的位掩碼進(jìn)行位與操作和左移操作的方法更新位向量;
f)后續(xù)判定動(dòng)作確認(rèn)是否發(fā)生模式匹配,并在發(fā)現(xiàn)模式匹配后,檢查是否出現(xiàn)下標(biāo)越界。
全文摘要
本發(fā)明提供的是一種高速精確單模式字符串匹配的方法,包含預(yù)處理和搜索兩個(gè)階段。其中預(yù)處理階段包括對(duì)模式的預(yù)處理、對(duì)文本的預(yù)處理和根據(jù)匹配條件判定最佳的匹配動(dòng)作,共三個(gè)主要步驟,搜索階段為進(jìn)行串匹配的過程,包括Scan Loop、Match Loop和后續(xù)判定動(dòng)作,共三個(gè)主要步驟。本發(fā)明在目前英文語(yǔ)料上進(jìn)行匹配時(shí)最高速的方法之一的SBNDM2算法基礎(chǔ)上進(jìn)行如下改進(jìn)通過引入下標(biāo)越界保護(hù)機(jī)制減少了下標(biāo)越界檢查的開銷;通過修改位掩碼與位向量定義的方式簡(jiǎn)化了算法;并通過擴(kuò)展SBNDM2的循環(huán)展開機(jī)制,確定了一種對(duì)于不同模式長(zhǎng)度和不同語(yǔ)料選擇最優(yōu)的循環(huán)展開字符的方法,提高算法針對(duì)不同匹配條件時(shí)的匹配性能。本發(fā)明所述方法是在模式長(zhǎng)度不超過機(jī)器字長(zhǎng)時(shí)的一種性能高,適用范圍廣泛的高速位并行精確單模式串匹配方法。
文檔編號(hào)G06F17/30GK101609455SQ20091007246
公開日2009年12月23日 申請(qǐng)日期2009年7月7日 優(yōu)先權(quán)日2009年7月7日
發(fā)明者姚念民, 范洪博 申請(qǐng)人:哈爾濱工程大學(xué)