專利名稱:一種多字符串匹配方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種多字符串匹配方法,屬于字符串匹配技術(shù)領(lǐng)域。
背景技術(shù):
在計(jì)算機(jī)領(lǐng)域,字符串匹配一直是計(jì)算機(jī)領(lǐng)域研究的焦點(diǎn)之一。字符串匹配問題 可以描述為已知需要匹配的t(t為正整數(shù))個(gè)子串(通常稱之為模式串,或規(guī)則),用P1, P2,…,P1表示,需要檢索的字符串(通常稱之為文本),用Τ[ρ··η](η為正整數(shù))表示,查 找在文本T[L···!!]中所有出現(xiàn)的模式串,并報(bào)告其出現(xiàn)的位置。所謂多模式匹配,就是在文 本串T[L···!!]中一次匹配多個(gè)模式串P1, P2,-,P^t = 1時(shí),多模式匹配蛻化為單模式匹 配。字符串匹配在拼寫檢查、語(yǔ)言翻譯搜索引擎等應(yīng)用中起著關(guān)鍵的作用;同時(shí),字符 串匹配也是眾多信息內(nèi)容安全系統(tǒng)中的關(guān)鍵技術(shù)之一。其中,多字符串匹配的方法目前已 經(jīng)廣泛用于網(wǎng)絡(luò)信息過濾,入侵檢測(cè)系統(tǒng)和生物信息計(jì)算的基因序列比較等實(shí)際應(yīng)用中。這些應(yīng)用的共同特點(diǎn)有以下兩個(gè)方面一是需要處理大量的數(shù)據(jù)(人類基因組共 有30多億個(gè)堿基對(duì);2009年6月,中國(guó)網(wǎng)絡(luò)國(guó)際出口帶寬達(dá)到747541Mbps) ;二是需要匹配 的關(guān)鍵詞條目多(以基因序列為例,關(guān)鍵詞條目達(dá)到0(104)的數(shù)量級(jí))。隨著網(wǎng)絡(luò)以及生 物學(xué)的發(fā)展,對(duì)多字符串匹配方法的處理能力提出了更高的要求。在傳統(tǒng)的多字符串匹配方法中,Wu. Sun和Udi. Manber在文獻(xiàn)《A Fast Algorithm for Multi-Pattern Searching))中提出的Wu-Manber方法,采用了跳躍不可能匹配的字符 策略和HASH散列的方法,加速匹配的進(jìn)行,在許多相關(guān)領(lǐng)域中得到了應(yīng)用。Wu-Manber方法包括一個(gè)預(yù)處理階段和一個(gè)掃描階段。在預(yù)處理階段,首先計(jì)算模式串集合P中最短的模式串長(zhǎng)度,記為m。然后,對(duì)所有 模式串(僅考慮前m個(gè)字符組成的模式串)構(gòu)建哈希表(記為HASH)、跳轉(zhuǎn)表(記為SHIFT) 和前綴表(記為PREFIX)。HASH表的每個(gè)表項(xiàng)指向最后B(B為正整數(shù),其值根據(jù)實(shí)驗(yàn)情況擇 優(yōu)選擇)個(gè)字符被哈希到該表項(xiàng)的模式串,如果有多個(gè)模式串被哈希到同一表項(xiàng),則采用 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ);SHIFT表用于在掃描文本串的時(shí)候,根據(jù)讀入字符串決定可以跳過的 字符數(shù),其最大值為(m-B+1),其最大值也成為跳越窗口的寬度;PREFIX表存儲(chǔ)的是每個(gè)模 式串前B' (B'為正整數(shù),其值根據(jù)實(shí)驗(yàn)情況擇優(yōu)選擇)個(gè)字符的哈希值。此處,建立HASH 表和PREFIX表所用到的哈希函數(shù)根據(jù)不同情況進(jìn)行選擇。在掃描階段,按如下步驟進(jìn)行第1步設(shè)一指針q,指向文本T的第m個(gè)字符;第2步從當(dāng)前指針往前的B-I個(gè)字符開始,向后掃描B個(gè)字符,使用預(yù)處理階段 建立HASH表所用到的哈希函數(shù),計(jì)算該B個(gè)字符的哈希值h ;第3步查SHIFT表,找到SHIFT [h]如果大于0,則將指針q向后移動(dòng)SHIFT [h] 個(gè)長(zhǎng)度,轉(zhuǎn)到第2步;否則轉(zhuǎn)到第4步;第4步從當(dāng)前指針往前的m-1個(gè)字符開始,向后掃描B'個(gè)字符,使用預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h';第5步查HASH表,找到HASH[h]的指針,遍歷鏈表。對(duì)鏈表中的每個(gè)模式串,如 果它在PREFIX表的值與前綴哈希值h'相等,則將文本串和模式串逐一字符進(jìn)行比較,判 斷是否完全匹配。如完全匹配,則報(bào)告完全匹配位置q ;否則,不報(bào)告;第6步判斷指針q是否指向文本串的結(jié)束符,如指向結(jié)束符,則結(jié)束過程;否則, 將指針q向后移動(dòng)一個(gè)字符,轉(zhuǎn)到第2步。經(jīng)過分析與實(shí)際運(yùn)用,發(fā)現(xiàn)WU-MANBER方法存在以下不足SHIFT表中表項(xiàng)的大小是影響匹配過程中窗口跳躍距離的關(guān)鍵。在傳統(tǒng)的 Wu-Manber方法中SHFIT表項(xiàng)中的最大值,同待匹配規(guī)則集的最短字符串長(zhǎng)度有關(guān),為 (m-B+1)。在實(shí)際應(yīng)用中,有時(shí)候規(guī)則集中只有少數(shù)幾個(gè)字符串為短字符串,其中絕大多數(shù) 為長(zhǎng)字符串。由于少數(shù)的短字符串的存在,使得SHIFT表中的值大大減少。這樣在匹配的 過程中,窗口的跳躍距離也大大減少。在這種情況下,Wu-Manber方法的性能受到極大影響。 特別是長(zhǎng)字符串的平均長(zhǎng)度遠(yuǎn)大于少數(shù)幾個(gè)短字符串的平均長(zhǎng)度時(shí)。例如有一個(gè)規(guī)則集, 其中字符串的最短長(zhǎng)度為100,在對(duì)該規(guī)則集運(yùn)用WU-MANBER方法進(jìn)行匹配的時(shí)候,SHIFT 表項(xiàng)中的最大值為(100-B+1)。若往該規(guī)則集中加入的少量的短字符串,這些短字符的最短 長(zhǎng)度為6,構(gòu)造成一個(gè)新的規(guī)則集。根據(jù)Wu-Manber方法匹配過程,SHIFT表項(xiàng)中的最大值 為(6-B+1)。若對(duì)新的規(guī)則集使用Wu-Manber方法進(jìn)行文本的匹配,由于SHIFT表項(xiàng)中的最 大值將由原來(100-B+1)迅速減小到(6-B+1),匹配過程中窗口的平均跳躍距離將大大減 少,Wu-Manber方法的快速性將受到影響。
發(fā)明內(nèi)容
本發(fā)明的目的是克服已有技術(shù)存在的不足,提出一種多字符串匹配方法。一種多字符串匹配方法,包括一個(gè)預(yù)處理階段和一個(gè)掃描階段。預(yù)處理階段包括構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴表PREFIX和短模式串過濾 表HOT,其具體工作步驟如下第1步設(shè)置HOT表的大小SUM以及HOT表選取的字符塊的長(zhǎng)度s ;其中,SUM彡256 并且SUM為正整數(shù);s = 2或3。第2步將模式串集合P中的全部模式串分為長(zhǎng)模式串和短模式串兩類,長(zhǎng)模式串 集合記為P1,短模式串集合記為P2,短模式串的數(shù)量記為SumP2 ;具體為第a步確定跳越窗口的寬度與最短模式串長(zhǎng)度的比值r,r為正整數(shù),其取值范圍 滿足公式1。2<r <lmax/lmin (1)其中,Imax為模式串集合P中最長(zhǎng)的模式串的長(zhǎng)度;Imin為模式串集合P中最短 的模式串長(zhǎng)度。第b步根據(jù)公式2、公式3確定分類標(biāo)準(zhǔn)M值M = rXlmin-(r-l) X s (2)第c步當(dāng)模式串的長(zhǎng)度大于M時(shí),則判斷其為長(zhǎng)模式串;否則,判斷其為短模式 串;
第d步判斷當(dāng)前的短模式串的數(shù)量SumP2是否滿足SumP2S 1. 5 X SUM,如果滿足,
執(zhí)行第3步;否則,減小r值,并確保r滿足2 < r < ^,然后返回到第b步。
/min第3步對(duì)于全部長(zhǎng)模式串的前M個(gè)字符組成的字符串StringL以及全部短模式 串的前Imin個(gè)字符組成的字符串StringS進(jìn)行操作,構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴 表PREFIX和短模式串過濾表HOT ;具體為①HASH表HASH表的每個(gè)表項(xiàng)指向所述字符串StringL或StringS最后B (B為 正整數(shù),其值根據(jù)實(shí)際情況確定)個(gè)字符被哈希到該表項(xiàng)的模式串,如果有多個(gè)模式串被 哈希到同一表項(xiàng),則采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ)。②PREFIX表存儲(chǔ)所述字符串StringL或StringS前B' (B'為正整數(shù),其值根 據(jù)實(shí)際情況確定)個(gè)字符的哈希值。③HOT表依次對(duì)短字符串集合P2中的所有模式串作如下操作第a步將指針指向其起始位置,向后取長(zhǎng)度為s的字符塊,計(jì)算其哈希值為h_ hot,將 H0T[h_hot]設(shè)置為 1 ;第b步將指針后移一位;判斷指針與該字符串的結(jié)束標(biāo)識(shí)符之間的距離是否為 (s-1),如果不是,執(zhí)行第a步;否則,結(jié)束操作;經(jīng)過上述步驟的操作,即可完成HOT表的構(gòu)建。④SHIFT 表首先,將SHIFT表中的所有項(xiàng)賦值為M-B+1 ;然后,對(duì)長(zhǎng)模式串集合P1中的模式串依次做如下處理第a步將指針指向該模式串的第M個(gè)字符,并用qi(qi為正整數(shù))表示當(dāng)前指針 指向字符串中的位置,qi的初始值為Μ;第b步向前取長(zhǎng)度為B的字符塊,計(jì)算其哈希值為h_shift_l,將SHIFT[h_ shift_l]的值設(shè)置為M-qi ;第c步將指針向前移動(dòng)一個(gè)字符,并為坫賦值為qi-Ι ;判斷距離該模式串的起 始字符的距離是否小于B-1,如果不是,回到第b步;否則,結(jié)束操作。再對(duì)短模式串集合P2中的模式串依次做如下處理第a步將指針指向該模式串的第Imin個(gè)字符,并用qj (qj為正整數(shù))表示當(dāng)前 指針指向字符串中的位置,Qj的初始值為Imin ;第b步向前取長(zhǎng)度為B的字符塊,計(jì)算其哈希值為h_shift_s,將SHIFT[h_ shift_s]的值設(shè)置為 lmin-qj ;第c步將指針向前移動(dòng)一個(gè)字符,并為qj賦值為qj-Ι ;判斷距離該模式串的起 始字符的距離是否小于B-1,如果不是,回到第b步;否則,結(jié)束操作。經(jīng)過上述步驟的操作,即可完成SHIFT表的構(gòu)建。所述HASH表、PREFIX、SHIFT表和HOT表在建立時(shí)所用到的哈希函數(shù)根據(jù)不同情 況進(jìn)行選擇。在掃描階段,按如下步驟進(jìn)行第1步設(shè)一指針q_text,指向文本T的第M個(gè)字符;第2步從當(dāng)前指針往前的B-I個(gè)字符開始,向后掃描B個(gè)字符,使用預(yù)處理階段建立HASH表所用到的哈希函數(shù),計(jì)算該B個(gè)字符的哈希值h ;第3步查SHIFT表,找到SHIFT[h];如果SHIFT[h]等于0,執(zhí)行第4步;否則,跳 轉(zhuǎn)到第7步;第4步從當(dāng)前指針往前的M-I個(gè)字符開始,向后掃描B'個(gè)字符,使用預(yù)處理階 段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_long ;從當(dāng)前指針 往前的Imin-I個(gè)字符開始,向后掃描B'個(gè)字符,使用預(yù)處理階段建立PREFIX表所用到的 哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_short ;第5步查HASH表,找到HASH[h]的指針,遍歷鏈表。對(duì)鏈表中的每個(gè)模式串,如 果它在PREFIX表的值與相應(yīng)的前綴哈希值(對(duì)于長(zhǎng)模式串,為h_long,對(duì)于短模式串,為 h.short)相等,則將文本T和模式串逐一字符進(jìn)行比較(對(duì)于長(zhǎng)模式串,匹配的起始位置 為當(dāng)前指針位置往前M-I個(gè)字符處;對(duì)于短模式串,匹配的起始位置為當(dāng)前指針位置往前 Imin-I個(gè)字符處),判斷是否完全匹配。如完全匹配,則報(bào)告完全匹配位置;否則,不報(bào)告;第6步將指針q_text向后移動(dòng)一個(gè)字符,轉(zhuǎn)到第8步。第7步若SHIFT [h]不大于(lmin-B+1),則將指針向后移動(dòng)SHIFT [h]個(gè)距離;否 則,進(jìn)行如下操作第a 步設(shè)置 r' =1,第b步從當(dāng)前指針?biāo)谖恢猛?(r' +1) X (lmin-s)-(B-l))個(gè)字符的位置處 向前取長(zhǎng)度為s的字符串;計(jì)算其哈希值hash_h,判斷“H0T[hash_h] = 0”是否成立;若成 立,執(zhí)行第c步;否則,跳轉(zhuǎn)到第d步;第c 步判斷“(r' +1) Xlmin-(r' ) X s_(B_l) < SHIFT[h] ”是否成立,若成立, 將r'取值為(r' +1),返回到第b步;否則,將指針向后移動(dòng)SHIFT[h]個(gè)字符的距離;第d步令dis = ((r' +1) Xlmin-r*s-(B-l)),并將指針向后移動(dòng)dis個(gè)字符的距離。第8步判斷指是否指向文本T的結(jié)束符,如指向結(jié)束符,則結(jié)束;否則, 轉(zhuǎn)到第2步。經(jīng)過上述步驟的操作,即可完成多個(gè)模式串的匹配。有益效果本發(fā)明的一種多字符串匹配方法與已有技術(shù)比較,具有以下優(yōu)點(diǎn)本發(fā)明結(jié)合了 原有Wu-Manber方法的窗口跳躍的優(yōu)點(diǎn),克服了其最大跳躍距離受到規(guī)則集中最短字符串 長(zhǎng)度限止的不足。通過引入HOT表,利用匹配過程中查找HOT的方法,使得窗口的最大跳躍 距離得到增大的同時(shí)不會(huì)遺漏短字符串。本發(fā)明方法具有更高的匹配效率。
具體實(shí)施例方式下面結(jié)合附圖
和具體實(shí)施例對(duì)本發(fā)明方案進(jìn)行詳細(xì)說明。實(shí)施例中,待匹配的模式串集合P中有3個(gè)模式串,分別為“english”、 "kilometer","fine",對(duì)應(yīng)長(zhǎng)度為7、9、4,其編號(hào)分別為0,1,2。其文本T的內(nèi)容為 "vmogenglishsdyfine ”;使用本發(fā)明提出的方法在文本T中搜索模式串“ engl ish”、 “kilometer”、“fine”的具體過程如下預(yù)處理階段包括構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴表PREFIX和短模式串過濾表HOT,其具體工作步驟如下第1步設(shè)置HOT表的大小SUM以及HOT表選取的字符塊的長(zhǎng)度s ;將SUM設(shè)置為 256,取 s = 2。第2步將模式串集合P中的全部模式串分為長(zhǎng)模式串和短模式串兩類,長(zhǎng)模式串 集合記為P1,短模式串集合記為P2,短模式串的數(shù)量記為SumP2 ;具體為第a步確定跳越窗口的寬度與最短模式串長(zhǎng)度的比值r,在本例中Imax = 9, Imin = 4,由公式1可得r = 2。第b步根據(jù)公式2、公式3確定分類標(biāo)準(zhǔn)M值:M = 2X4-(2-1) X2 = 6。第c步當(dāng)模式串的長(zhǎng)度大于6時(shí),則判斷其為長(zhǎng)模式串;否則,判斷其為短模式 串;因此將“englisWkilometer”歸入長(zhǎng)模式串集合;“fine”歸入短模式串集合。該 過程結(jié)束后,將原有模式串集合劃分為長(zhǎng)模式串集合與短模式串集合;長(zhǎng)模式串集合包括 "english","kilometer";短模式串集合包括“fine”。第d步判斷當(dāng)前的短模式串的數(shù)量SumP2是否滿足SumP2 ( RX SUM,此時(shí)取R = 50%,由于 SumP2 = 1,RXSUM = 50% X256 = 128,滿足 SumP2 彡 RXSUM,執(zhí)行第 3 步。第3步對(duì)于全部長(zhǎng)模式串的前6個(gè)長(zhǎng)度的字符進(jìn)行截取,對(duì)短模式串的前4個(gè)字 符進(jìn)行截取,得到StringL與StringS的集合,如表1所示。表IStringL 與 StringS 集合 根據(jù)StringL與StringS,構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴表PREFIX和短模 式串過濾表HOT ;首先選定構(gòu)造時(shí)所用到的哈希函數(shù),對(duì)于HASH表,PREFIX表,以及SHIFT表的構(gòu) 造,均選用哈希函數(shù)hashl ;對(duì)于HOT表,選用哈希函數(shù)hash2 ;兩個(gè)函數(shù)的定義如下unsigned int hashl(char氺str){unsigned int hash_value = 0 ;while (*str ! = NULL) {hash_value << = 6 ;hash_value+ =氺str++ ;}return hash_value & 0x2fffT ;}unsigned int hash2(char氺str){unsigned int hash_value = 0 ;while (*str ! = NULL) {hash_value <<= 6 ;
將HASH表、SHIFT表的大小選取為0x2ffff,PREFIX表的大小為規(guī)則集中模式串 的數(shù)目3,HOT表的大小如前文中所示,用16進(jìn)制表示為OxfT。具體構(gòu)造過程為①HASH表選取B = 2,對(duì)于StringL集合中的“englis”,選取“is”,計(jì)算哈希值 為6835,將“english”添加至HASH[6835]中;在“kilome”的末尾,選取“me”,計(jì)算其哈希 值為7077,將“kilometer”添加至HASH[7077]中;對(duì)于StringS集合中的“fine”,選取末 尾“ne”,計(jì)算其哈希值,假定為7141,將“fine”添加至HASH[7141]中。HASH表如表2所
7J\ ο表2本發(fā)明方法得到的HASH表
哈希值683570777141對(duì)應(yīng)模式串NULLenglishNULLkilometerNULLfineNULL②PREFIX表選取B' = 2,對(duì)于StringL集合中的“englis”的起始,選取“en”,計(jì) 算哈希值為6574,將PREFIX表中“englis”的對(duì)應(yīng)項(xiàng)PREFIX
賦值為6574 ;在“kilome” 的起始,選取“ki”,計(jì)算其哈希值為6953,將PREFIX表中“kilome”的對(duì)應(yīng)項(xiàng)PREFIX[1]賦 值為6953 ;對(duì)于StringS集合中的“fine”,在起始處選取“fi ”,計(jì)算其哈希值為6633,將 PREFIX表中“fine”的對(duì)應(yīng)項(xiàng)PREFIX[2]賦值為6633。PREFIX表如表3所示。表3本發(fā)明方法得到的PREFIX表
規(guī)則編號(hào)012PREFIX657469536633③HOT表設(shè)定構(gòu)建HOT表的字符塊長(zhǎng)度為s = 2,HOT表的大小為256,并將HOT 表中的值均初始化為0。對(duì)于短模式串集合中的“fine”,首先將指針指向其起始位置,向后 選取長(zhǎng)度為2的字符塊“fi”,計(jì)算其哈希值為233,則令HOT [233] = 1 ;將指針往后移動(dòng)一 位,向后選取長(zhǎng)度為2的字符塊“in”,計(jì)算其哈希值為174,令HOT[174] = 1 ;將指針往后 移動(dòng)一位,向后選取長(zhǎng)度為2的字符塊“ne”,計(jì)算其哈希值為229,則令HOT [229] = 1 ;至 此,fine中任意長(zhǎng)度為2字符塊均進(jìn)行了 HOT表的填寫處理,對(duì)“fine”的處理結(jié)束。對(duì)短 模式集合P2中的所有模式串,進(jìn)行相同的處理。本例中,P2中僅有一個(gè)模式串,HOT表的構(gòu) 造結(jié)束。HOT表如表4所示。表4本發(fā)明方法得到的HOT表
10 ④SHIFT 表首先,將SHIFT表中的所有項(xiàng)賦值為M-B+1,此時(shí)有M = 6,B = 2,即SHIFT表中的 所有項(xiàng)初始化為5 ;然后,對(duì)長(zhǎng)模式串集合P1中的模式串進(jìn)行處理。對(duì)于“english”,將指針指向該模式串的第6個(gè)字符“S”,此時(shí)當(dāng)前指針的位置為 Qi = 6。向前取長(zhǎng)度為2的字符塊“is”,計(jì)算其哈希值為6835,將SHIFT[6835]的值設(shè)置 為M-qi = 0 ;將指針向前移動(dòng)一個(gè)字符,將qi賦值為qi-Ι = 5,此時(shí)向前取字符塊“ Ii ”, 計(jì)算其哈希值為7017,將SHIFT[7017]的值設(shè)置為M_qi = 1 ;將指針繼續(xù)向前移動(dòng)一個(gè)字 符,將qi賦值為qi-Ι = 4,此時(shí)向前取字符塊“gl”,計(jì)算其哈希值為6700,將SHIFT[6700] 的值設(shè)置為M-qi = 2 ;繼續(xù)按照該方法填寫SHFTT表,直至指針移至距離模式串起始距離 為2,此時(shí)qi = 2,向前取字符塊“en”,計(jì)算其哈希值為6574,將SHIFT [6574]的值設(shè)置為 M-qi =4。再將指針向前移動(dòng)一個(gè)字符,則有qi = 1,此時(shí)距離該模式串的起始字符的距離 為qi-丨=0小于B-I = 1。至此,對(duì)“english”的處理結(jié)束。對(duì)長(zhǎng)模式串集合P1中的另一 模式串“kilome”采用相同的方法處理,直至處理完P(guān)1中所有模式串。再對(duì)短模式串集合P2中的模式串進(jìn)行處理。對(duì)于“fine”,將指針指向該模式串的第4個(gè)字符“e”,此時(shí)當(dāng)前指針的位置為qj =6。向前取長(zhǎng)度為2的字符塊“ne”,計(jì)算其哈希值為7141,將SHIFT[7141]的值設(shè)置為 lmin-qj = 0 ;將指針向前移動(dòng)一個(gè)字符,將qj賦值為qj_l = 3,此時(shí)向前取字符塊“in”, 計(jì)算其哈希值為6830,將SHIFT [6830]的值設(shè)置為lmin-qj = 1 ;將指針繼續(xù)向前移動(dòng)一個(gè) 字符,將qj賦值為qj-Ι = 2,向前取字符塊“fi”,計(jì)算其哈希值為6633,將SHIFT [6633]的 值設(shè)置為lmin-qj = 2。再將指針向前移動(dòng)一個(gè)字符,則有qj = 1,此時(shí)距離該模式串的起 始字符的距離為qj-1 =0小于B-I = 1。至此,對(duì)“fine”的處理結(jié)束。由于P2中僅含有 模式串“fine”,對(duì)P2的處理也結(jié)束。從而得到構(gòu)建好的SHIFT表,如表5所示。表5本發(fā)明方法得到的SHIFT表 下面對(duì)文本T進(jìn)行掃描,尋找模式串,詳細(xì)過程如下第1步設(shè)一指針q_text,指向文本T的第6個(gè)字符“η”。第2步從當(dāng)前指針往前的1個(gè)字符開始,向后取長(zhǎng)度為2的字符塊“en”,使用預(yù) 處理階段建立HASH表所用到的哈希函數(shù),計(jì)算其哈希值為6574。第3步根據(jù)該哈希值,查找SHIFT表,可得SHIFT [6574] = 4 ;轉(zhuǎn)到第7步。第7步若SHIFT[h]大于3,需要查找HOT表。取r' =1,在文本T中距離當(dāng) 前指針位置(第6個(gè)字符)往后3個(gè)字符(第9個(gè)字符)處,向前讀取長(zhǎng)度為s = 2的 字符塊“l(fā)i”,計(jì)算其哈希值并查找HOT表,由于HOT表中相應(yīng)項(xiàng)為0,將r'增大為2,判 斷(r' +1) X Imin-(r' ) X s-(B_l) < 4是否成立,不成立,因此,可將指針向后移動(dòng) SHIFT[6574] = 4個(gè)距離,此時(shí)指針指向文本T中第10個(gè)字符。第8步判斷指針q_text未指向文本T的結(jié)束符,轉(zhuǎn)到第2步。第2步從當(dāng)前指針往前的1個(gè)字符開始,向后取長(zhǎng)度為2的字符塊“is”,使用預(yù) 處理階段建立HASH表所用到的哈希函數(shù),計(jì)算其哈希值為6835。第3步根據(jù)該哈希值,查找SHIFT表,可得SHIFT [6574] = 0 ;執(zhí)行第4步。第4步從當(dāng)前指針往前的M-I = 5個(gè)字符開始,向后掃描B' = 2個(gè)字符,使用 預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_long = 6574;從當(dāng)前指針往前的Imin-I = 3個(gè)字符開始,向后掃描B' =2個(gè)字符,使用預(yù)處理階 段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_short = 6700 ;第5步查HASH表,找到HASH[6835]所對(duì)應(yīng)的模式串為“english”,將其在PREFIX 表中的值“6574”與h_long對(duì)比,發(fā)現(xiàn)相等。因此,將文本與模式串“english”逐一比較, 發(fā)現(xiàn)完全匹配。于是,報(bào)告“english”在文本中的位置。此時(shí),指針q_text指向第11個(gè)字 符)第6步將指針q_text向后移動(dòng)一個(gè)字符(第12個(gè)字符),轉(zhuǎn)到第8步。第8步判斷指針q_text未指向文本T的結(jié)束符,轉(zhuǎn)到第2步。第2步從當(dāng)前指針往前的1個(gè)字符開始,向后取長(zhǎng)度為2的字符塊“hs”,使用預(yù) 處理階段建立HASH表所用到的哈希函數(shù),計(jì)算其哈希值為6771。第3步根據(jù)該哈希值,查找SHIFT表,可得SHIFT[6771] = 5 ;轉(zhuǎn)到第7步。第7步若SHIFT[h]大于3,需要查找HOT表。取r' =1,在文本T中距離當(dāng) 前指針位置(第12個(gè)字符)往后3個(gè)字符(第15個(gè)字符)處,向前讀取長(zhǎng)度為s = 2 的字符塊“yf ”,計(jì)算其哈希值并查找HOT表,由于HOT表中相應(yīng)項(xiàng)為0,將r ‘增大為2, 判斷(r' +1) X Imin-(r' ) X s_(B_l) < 5是否成立,不成立,因此,可將指針向后移動(dòng) SHIFT[6574] = 5個(gè)距離,此時(shí)指針指向文本T中第17個(gè)字符。第8步判斷指針q_text未指向文本T的結(jié)束符,轉(zhuǎn)到第2步。第2步從當(dāng)前指針往前的1個(gè)字符開始,向后取長(zhǎng)度為2的字符塊“in”,使用預(yù) 處理階段建立HASH表所用到的哈希函數(shù),計(jì)算其哈希值為6830。
第3步根據(jù)該哈希值,查找SHIFT表,可得SHIFT [6830] = 1 ;執(zhí)行第7步。第7步若SHIFT[h]不大于3,則將指針向后移動(dòng)1個(gè)距離,此時(shí),指針指向文本T 中第18個(gè)字符。第8步判斷指針q_text未指向文本T的結(jié)束符,轉(zhuǎn)到第2步。第2步從當(dāng)前指針往前的1個(gè)字符開始,向后取長(zhǎng)度為2的字符塊“ne”,使用預(yù) 處理階段建立HASH表所用到的哈希函數(shù),計(jì)算其哈希值為7141。第3步根據(jù)該哈希值,查找SHIFT表,可得SHIFT[7141] = 0;執(zhí)行第4步。第4步從當(dāng)前指針往前的M-I = 5個(gè)字符開始,向后掃描B' = 2個(gè)字符“dy”, 使用預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_long =6521 ;從當(dāng)前指針往前的Imin-I = 3個(gè)字符開始,向后掃描B' = 2個(gè)字符“fi”,使用 預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B'個(gè)字符的前綴哈希值h_short = 6633 ;第5步查HASH表,找到HASH[7141]所對(duì)應(yīng)的模式串為“fine”,將其在PREFIX表 中的值“6633”與1!_吐0汁對(duì)比,發(fā)現(xiàn)相等。因此,將文本與模式串“fine”逐一比較,發(fā)現(xiàn) 完全匹配。于是,報(bào)告“fine”在文本中的位置。此時(shí),指針q_text指向第18個(gè)字符)第6步將指針q_text向后移動(dòng)一個(gè)字符(第19個(gè)字符),轉(zhuǎn)到第8步。第8步判斷指針q_text指向文本T的結(jié)束符,結(jié)束操作。為說明本發(fā)明的效果,使用原始WU-MANBER方法對(duì)本實(shí)施例中的數(shù)據(jù)進(jìn)行操作, 得到SHIFT表如6所示表6原始WU-MANBER方法得到的SHIFT表 通過兩種方法的比較,可以看出本發(fā)明方法將原始的WU-MANBER方法中的最大 跳躍距離Imin-I = 3擴(kuò)大至M-B+1 = 5,使得在匹配的過程中能夠跳躍更遠(yuǎn)的距離,減少跳 躍的次數(shù),從而提高匹配的效率。實(shí)際上,根據(jù)模式串集合構(gòu)造的SHFIT表中值的平均大小 能夠反映匹配過程中跳躍的平均長(zhǎng)度。以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人 員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn),或者對(duì)其中部分技術(shù)特征進(jìn) 行等同替換,這些改進(jìn)和替換也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種多字符串匹配方法,其特征在于包括一個(gè)預(yù)處理階段和一個(gè)掃描階段;預(yù)處理階段包括構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴表PREFIX和短模式串過濾表HOT,其具體工作步驟如下第1步設(shè)置HOT表的大小SUM以及HOT表選取的字符塊的長(zhǎng)度s;其中,SUM≥256并且SUM為正整數(shù);s=2或3;第2步將模式串集合P中的全部模式串分為長(zhǎng)模式串和短模式串兩類,長(zhǎng)模式串集合記為P1,短模式串集合記為P2,短模式串的數(shù)量記為SumP2;具體為第a步確定跳越窗口的寬度與最短模式串長(zhǎng)度的比值r,r為正整數(shù),其取值范圍滿足公式1; <mrow><mn>2</mn><mo>≤</mo><mi>r</mi><mo>≤</mo><mfrac> <mrow><mi>l</mi><mi>max</mi> </mrow> <mrow><mi>l</mi><mi>min</mi> </mrow></mfrac><mo>-</mo><mo>-</mo><mo>-</mo><mrow> <mo>(</mo> <mn>1</mn> <mo>)</mo></mrow> </mrow>其中,lmax為模式串集合P中最長(zhǎng)的模式串的長(zhǎng)度;lmin為模式串集合P中最短的模式串長(zhǎng)度;第b步根據(jù)公式2、公式3確定分類標(biāo)準(zhǔn)M值M=r×lmin (r 1)×s(2)第c步當(dāng)模式串的長(zhǎng)度大于M時(shí),則判斷其為長(zhǎng)模式串;否則,判斷其為短模式串;第d步判斷當(dāng)前的短模式串的數(shù)量SumP2是否滿足SumP2≤1.5×SUM,如果滿足,執(zhí)行第3步;否則,減小r值,并確保r滿足然后返回到第b步;第3步對(duì)于全部長(zhǎng)模式串的前M個(gè)字符組成的字符串StringL以及全部短模式串的前l(fā)min個(gè)字符組成的字符串StringS進(jìn)行操作,構(gòu)建哈希表HASH、跳轉(zhuǎn)表SHIFT、前綴表PREFIX和短模式串過濾表HOT;具體為①HASH表HASH表的每個(gè)表項(xiàng)指向所述字符串StringL或StringS最后B個(gè)字符被哈希到該表項(xiàng)的模式串,如果有多個(gè)模式串被哈希到同一表項(xiàng),則采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ);其中,B為正整數(shù),其值根據(jù)實(shí)際情況確定;②PREFIX表存儲(chǔ)所述字符串StringL或StringS前B′個(gè)字符的哈希值;其中,B′為正整數(shù),其值根據(jù)實(shí)際情況確定;③HOT表依次對(duì)短字符串集合P2中的所有模式串作如下操作第a步將指針指向其起始位置,向后取長(zhǎng)度為s的字符塊,計(jì)算其哈希值為h_hot,將HOT[h_hot]設(shè)置為1;第b步將指針后移一位;判斷指針與該字符串的結(jié)束標(biāo)識(shí)符之間的距離是否為(s 1),如果不是,執(zhí)行第a步;否則,結(jié)束操作;經(jīng)過上述步驟的操作,即可完成HOT表的構(gòu)建;④SHIFT表首先,將SHIFT表中的所有項(xiàng)賦值為M B+1;然后,對(duì)長(zhǎng)模式串集合P1中的模式串依次做如下處理第a步將指針指向該模式串的第M個(gè)字符,并用qi表示當(dāng)前指針指向字符串中的位置,qi為正整數(shù),qi的初始值為M;第b步向前取長(zhǎng)度為B的字符塊,計(jì)算其哈希值為h_shift_l,將SHIFT[h_shift_l]的值設(shè)置為M qi;第c步將指針向前移動(dòng)一個(gè)字符,并為qi賦值為qi 1;判斷距離該模式串的起始字符的距離是否小于B 1,如果不是,回到第b步;否則,結(jié)束操作;再對(duì)短模式串集合P2中的模式串依次做如下處理第a步將指針指向該模式串的第lmin個(gè)字符,并用qj表示當(dāng)前指針指向字符串中的位置,qj為正整數(shù),qj的初始值為lmin;第b步向前取長(zhǎng)度為B的字符塊,計(jì)算其哈希值為h_shift_s,將SHIFT[h_shift_s]的值設(shè)置為lmin qj;第c步將指針向前移動(dòng)一個(gè)字符,并為qj賦值為qj 1;判斷距離該模式串的起始字符的距離是否小于B 1,如果不是,回到第b步;否則,結(jié)束操作;經(jīng)過上述步驟的操作,即可完成SHIFT表的構(gòu)建;所述HASH表、PREFIX、SHIFT表和HOT表在建立時(shí)所用到的哈希函數(shù)根據(jù)不同情況進(jìn)行選擇;在掃描階段,按如下步驟進(jìn)行第1步設(shè)一指針q_text,指向文本T的第M個(gè)字符;第2步從當(dāng)前指針往前的B 1個(gè)字符開始,向后掃描B個(gè)字符,使用預(yù)處理階段建立HASH表所用到的哈希函數(shù),計(jì)算該B個(gè)字符的哈希值h;第3步查SHIFT表,找到SHIFT[h];如果SHIFT[h]等于0,執(zhí)行第4步;否則,跳轉(zhuǎn)到第7步;第4步從當(dāng)前指針往前的M 1個(gè)字符開始,向后掃描B′個(gè)字符,使用預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B′個(gè)字符的前綴哈希值h_long;從當(dāng)前指針往前的lmin 1個(gè)字符開始,向后掃描B′個(gè)字符,使用預(yù)處理階段建立PREFIX表所用到的哈希函數(shù),計(jì)算這B′個(gè)字符的前綴哈希值h_short;第5步查HASH表,找到HASH[h]的指針,遍歷鏈表;對(duì)鏈表中的每個(gè)模式串,如果它在PREFIX表的值與相應(yīng)的前綴哈希值相等,則將文本T和模式串逐一字符進(jìn)行比較;判斷是否完全匹配;如完全匹配,則報(bào)告完全匹配位置;否則,不報(bào)告;對(duì)于長(zhǎng)模式串,匹配的起始位置為當(dāng)前指針位置往前M 1個(gè)字符處;對(duì)于短模式串,匹配的起始位置為當(dāng)前指針位置往前l(fā)min 1個(gè)字符處;第6步將指針q_text向后移動(dòng)一個(gè)字符,轉(zhuǎn)到第8步;第7步若SHIFT[h]不大于(lmin B+1),則將指針向后移動(dòng)SHIFT[h]個(gè)距離;否則,進(jìn)行如下操作第a步設(shè)置r′=1,第b步從當(dāng)前指針?biāo)谖恢猛?(r′+1)×(lmin s) (B 1))個(gè)字符的位置處向前取長(zhǎng)度為s的字符串;計(jì)算其哈希值hash_h,判斷“HOT[hash_h]=0”是否成立;若成立,執(zhí)行第c步;否則,跳轉(zhuǎn)到第d步;第c步判斷“(r′+1)×lmin (r′)×s (B 1)<SHIFT[h]”是否成立,若成立,將r′取值為(r′+1),返回到第b步;否則,將指針向后移動(dòng)SHIFT[h]個(gè)字符的距離;第d步令dis=((r′+1)×lmin r*s (B 1)),并將指針向后移動(dòng)dis個(gè)字符的距離;第8步判斷指針q_text是否指向文本T的結(jié)束符,如指向結(jié)束符,則結(jié)束;否則,轉(zhuǎn)到第2步;經(jīng)過上述步驟的操作,即可完成多個(gè)模式串的匹配。FSA00000199047500012.tif
全文摘要
本發(fā)明涉及一種多字符串匹配方法,屬于字符串匹配技術(shù)領(lǐng)域。本發(fā)明基于傳統(tǒng)的Wu-Manber方法,對(duì)規(guī)則集中的長(zhǎng)字符串和短字符串進(jìn)行了分離,在建SHIFT表時(shí),對(duì)規(guī)則集中的長(zhǎng)字符串和短字符串采取不同的處理方式,從而使得SHIFT表的最大表項(xiàng)不受到短字符串長(zhǎng)度的限制,克服了其最大跳躍距離受到規(guī)則集中最短字符串長(zhǎng)度限制的不足;通過引入HOT表,利用匹配過程中查找HOT的方法,使得窗口的最大跳躍距離得到增大的同時(shí)不會(huì)遺漏短字符串。本發(fā)明方法具有更高的匹配效率。
文檔編號(hào)G06F17/30GK101901257SQ20101023246
公開日2010年12月1日 申請(qǐng)日期2010年7月21日 優(yōu)先權(quán)日2010年7月21日
發(fā)明者嵩天, 黎達(dá) 申請(qǐng)人:北京理工大學(xué)