亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于有序二叉樹的模式匹配方法

文檔序號:6469408閱讀:255來源:國知局
專利名稱:基于有序二叉樹的模式匹配方法
技術(shù)領(lǐng)域
本發(fā)明涉及的是一種信息技術(shù)領(lǐng)域的方法,具體是一種基于有序二叉樹的模 式匹配方法。
背景技術(shù)
在信息技術(shù)領(lǐng)域,如何在一個動態(tài)字符串中定位指定的模式串是一個非常典 型的問題。該技術(shù)的應(yīng)用范圍非常廣泛,例如,信息抽取、文本編輯、惡意代碼 查找、DNA序列匹配等等。當(dāng)前,基于普通樹型結(jié)構(gòu)的有限狀態(tài)自動機(jī)(DFSA, Deterministic Finite State Automaton)方法是解決多模式匹配問題的常用方 法?;跇湫徒Y(jié)構(gòu)的有限自動機(jī)在應(yīng)用程序中構(gòu)造一次,就可以隨時在應(yīng)用程序 中使用,應(yīng)用非常廣泛。在實(shí)際應(yīng)用中,有一些新的問題逐漸受到重視。在線更 新的模式串集合査找的需求(實(shí)現(xiàn)編輯軟件中多字符串的査找和替換功能);內(nèi)存
節(jié)約的需求(使方法方便應(yīng)用于PDA、潛入式系統(tǒng)軟件等);同時要求匹配速度不 能降低。然而基于樹型結(jié)構(gòu)的有限自動機(jī)由于構(gòu)造速度慢、內(nèi)存空間耗費(fèi)大的缺 點(diǎn),不能很好地滿足這些要求。
經(jīng)對現(xiàn)有技術(shù)文獻(xiàn)的檢索發(fā)現(xiàn),論文Efficient string matching: An aid to bibliographic search (高效字符串匹配方法目錄査找的輔助手段),引文 出處Communications of the ACM, 1975, 18 (6) :333-340 (ACM通訊,1975年, 18巻,6期,333-340頁)。該文獻(xiàn)是多模式匹配的奠基,其核心方法是基于普通 樹型結(jié)構(gòu)的有限狀態(tài)自動機(jī)(DFSA)方法,該方法是解決多模式匹配問題的常用 方法。DFSA方法在匹配前對模式串集合進(jìn)行預(yù)處理,轉(zhuǎn)換成樹型有限狀態(tài)自動機(jī), 然后只需對文本串進(jìn)行一次掃描就可找出所有模式串,其査找時間復(fù)雜度是O(n)。 但該方法的不足之處在于基于樹型結(jié)構(gòu)的有限自動機(jī)特別適用于模式串集合相 對穩(wěn)定的情況,例如,詞典是一個相對穩(wěn)定的模式串集合,只需在應(yīng)用程序中構(gòu) 造一次,就可以隨時在應(yīng)用程序中使用。
經(jīng)檢索還發(fā)現(xiàn),An efficient algorithm for match multiple patterns (匹配多模式串的高效方法),IEEE Transaction on Knowledge and Data Engineering, 1993, 5(2) :339-351 (IEEE知識和數(shù)據(jù)工程通訊,1993年,5巻,2期,339-351 頁)。該文獻(xiàn)在經(jīng)典DFSA方法的基礎(chǔ)上增加了跳躍式査找的思想,也可以簡單理 解為DFSA和經(jīng)典BM單模式匹配方法的結(jié)合。由此可知,該技術(shù)根本沒有改變DFSA 方法。

發(fā)明內(nèi)容
本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的不足,提供了一個基于有序二叉樹的 模式匹配方法,使其能夠經(jīng)過一次掃描源字符串就能夠定位多個不同模式串在源 字符串中的位置。本發(fā)明改變了傳統(tǒng)DFSA方法,提高了構(gòu)造速度;提高了査找速 度;支持動態(tài)增刪模式串;不需要額外的轉(zhuǎn)向、失敗和輸出表示。
本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的,本發(fā)明包括如下步驟
步驟一、構(gòu)造有序二叉樹對二叉樹按NLR (Node-Left-Right,前序遍歷) 方式遍歷,設(shè)定遍歷二叉樹時的順序,得到一系列的模式串,如果這些模式串得 到的先后順序和它們的字典序相同,即獲得有序二叉樹,同時在有序二叉樹上構(gòu) 造出失敗指針,以重復(fù)利用已經(jīng)匹配成功的模式串子串信息;
步驟二、査找階段根據(jù)構(gòu)造的有序二叉樹及goto函數(shù)和失敗指針對源字串 進(jìn)行一次查找,定位出模式串在源字串中的精確位置,査找的過程如下從有序 二叉樹的根節(jié)點(diǎn)出發(fā),逐個取出源字串中的字符,根據(jù)goto函數(shù)和失敗指針確定 狀態(tài)之間的轉(zhuǎn)換,當(dāng)源字串的所有字符都被取出后,査找過程就結(jié)束。
所述的設(shè)定遍歷二叉樹時的順序,具體如下設(shè)置棧s用來存放模式串,指 針p用來跟蹤節(jié)點(diǎn),當(dāng)指針p指向當(dāng)前節(jié)點(diǎn)的右子樹時,棧s的棧頂元素出棧, 右子樹上的元素入棧;當(dāng)指針p指向當(dāng)前節(jié)點(diǎn)的左子樹時,左子樹上的元素直接 入棧,重復(fù)上述過程直到P指向葉子節(jié)點(diǎn),此時,棧內(nèi)的元素就是某一個模式串。
所述的失敗指針,是指為了重復(fù)利用已經(jīng)匹配成功的子字串信息而使用的一 種指針,具體是指在有序二叉樹的某個狀態(tài)Sl時,應(yīng)用goto函數(shù)將達(dá)到一個 新的狀態(tài),如果goto函數(shù)調(diào)用正確,則到達(dá)狀態(tài)Sl某一個子狀態(tài)節(jié)點(diǎn),如果調(diào) 用錯誤,則由失敗指針指向一個固定的節(jié)點(diǎn)狀態(tài),以避免重新回到根節(jié)點(diǎn)重新匹 配,合理利用了已經(jīng)成功匹配的子字串信息,從而就節(jié)約了査找階段的時間。
所述失敗指針,其構(gòu)造方式具體如下(1) 根節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);
(2) 狀態(tài)深度為1的節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);
(3) 對于狀態(tài)深度大于等于2的節(jié)點(diǎn)s,若其父狀態(tài)為r且goto(r, a)=s, s的失敗指針指向的確定是一個遞歸過程,具體如下
① 如果goto(s的父狀態(tài)的失敗指針指向的狀態(tài),a)的運(yùn)算結(jié)果不是一個實(shí) 際存在的狀態(tài)時,s重新被賦值為s的父狀態(tài);
② 依次循環(huán)步驟a,直到goto(s的父狀態(tài)的失敗指針指向的狀態(tài),a)的運(yùn)算 結(jié)果為一個實(shí)際存在的狀態(tài);
③ s的失敗指針被賦值為s的父狀態(tài)。
所述goto函數(shù)是指根據(jù)設(shè)定的遍歷二叉樹時的順序,構(gòu)造狀態(tài)轉(zhuǎn)化的函數(shù), 具體如下按照設(shè)定的遍歷二叉樹的順序,從節(jié)點(diǎn)sl出發(fā)到其任一子狀態(tài)節(jié)點(diǎn)的 過程中,如果到達(dá)了子狀態(tài)節(jié)點(diǎn)s2并且此時棧中有且僅有字符c,則goto函數(shù)被 構(gòu)造為goto(sl, c) = s2,也就是,在狀態(tài)節(jié)點(diǎn)sl,輸入字符c后,將轉(zhuǎn)向狀態(tài) s2。
所述的狀態(tài)深度是指節(jié)點(diǎn)在構(gòu)造過程中的深度,具體如下節(jié)點(diǎn)的狀態(tài)深度 不同于二叉樹的節(jié)點(diǎn)深度,二叉樹的節(jié)點(diǎn)深度是該節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑,而狀態(tài) 深度反映了字符在相應(yīng)的模式串中的位置,狀態(tài)深度按如下方式設(shè)定根節(jié)點(diǎn)的 狀態(tài)深度設(shè)置為0,如果某節(jié)點(diǎn)的狀態(tài)深度是h,則它的左子節(jié)點(diǎn)的狀態(tài)深度設(shè) 置為h+l,右子節(jié)點(diǎn)的狀態(tài)深度設(shè)置為h,依次類推可以確定所有節(jié)點(diǎn)的狀態(tài)深度。
所述的父、子狀態(tài)節(jié)點(diǎn)是指節(jié)點(diǎn)之間的父子關(guān)系,具體如下如果節(jié)點(diǎn)l是
節(jié)點(diǎn)f的左子樹,節(jié)點(diǎn)集合R={r|r是1的右子樹上的節(jié)點(diǎn)并且具有和1相同的狀 態(tài)深度},則f是1和R中所有節(jié)點(diǎn)的父狀態(tài)節(jié)點(diǎn),l和R中所有節(jié)點(diǎn)是f的子狀 態(tài)節(jié)點(diǎn)。
與現(xiàn)有技術(shù)相比,本發(fā)明具有如下有益效果
本發(fā)明構(gòu)造出了有序二叉樹(sequential binary tree),并用有序二叉樹來 代替普通樹型結(jié)構(gòu)實(shí)現(xiàn)了一種新的多模式匹配方法,即基于有序二叉樹的多模式 匹配方法。本發(fā)明的構(gòu)造速度快,便于動態(tài)增刪節(jié)點(diǎn)(模式串),同時不用額外的 轉(zhuǎn)向、失敗和輸出表,査找效率和傳統(tǒng)方法一樣高,具體如下
1、相對于傳統(tǒng)的多叉樹結(jié)構(gòu)而言,本發(fā)明提高了構(gòu)造速度,二叉樹只有左右兩棵子樹,實(shí)現(xiàn)時不用預(yù)測有幾個子節(jié)點(diǎn),避免了內(nèi)存的浪費(fèi)和頻繁的內(nèi)存分配 和釋放操作;
2、 相對于傳統(tǒng)的DFSA方法而言,本發(fā)明提高了查找速度,由于有序二叉樹 結(jié)構(gòu)體現(xiàn)了模式串的字典序,狀態(tài)轉(zhuǎn)向的速度得到了提高;
3、 相對于傳統(tǒng)DFSA方法而言,本發(fā)明支持動態(tài)增刪模式串,采用二叉樹結(jié) 構(gòu)使節(jié)點(diǎn)的增刪更加方便,所以,本發(fā)明的方法易于實(shí)現(xiàn)模式串的動態(tài)增刪,特 別適應(yīng)于需要動態(tài)調(diào)整模式串的一類應(yīng)用需求
4、 相對于傳統(tǒng)DFSA方法而言,本發(fā)明不需要額外的轉(zhuǎn)向、失敗和輸出表示, 本發(fā)明用指針代替了額外的轉(zhuǎn)向、失敗和輸出表,節(jié)省了內(nèi)存開銷。


圖1是本發(fā)明構(gòu)造出的有序二叉樹結(jié)構(gòu)示意圖2是本發(fā)明中狀態(tài)深度和各節(jié)點(diǎn)之間的父子關(guān)系示意圖3是本發(fā)明中構(gòu)造了失敗指針的有序二叉樹的示意圖。
具體實(shí)施例方式
結(jié)合附圖對本發(fā)明的實(shí)施例作詳細(xì)說明。本實(shí)施例在以本發(fā)明技術(shù)方案為前 提下進(jìn)行實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍 不限于下述的實(shí)施例。
本實(shí)施例包括如下步驟
步驟一、構(gòu)造有序二叉樹對二叉樹按NLR方式遍歷,設(shè)定遍歷二叉樹時的 順序,得到一系列的模式串,如果這些模式串得到的先后順序和它們的字典序相 同,即獲得有序二叉樹,同時在有序二叉樹上構(gòu)造出失敗指針,以重復(fù)利用已經(jīng) 匹配成功的模式串子串信息,如圖l所示;
步驟二、查找階段根據(jù)構(gòu)造的有序二叉樹及goto函數(shù)和失敗指針對源字串 進(jìn)行一次査找,定位出模式串在源字串中的精確位置,査找的過程如下從有序 二叉樹的根節(jié)點(diǎn)出發(fā),逐個取出源字串中的字符,根據(jù)goto函數(shù)和失敗指針確定 狀態(tài)之間的轉(zhuǎn)換,當(dāng)源字串的所有字符都被取出后,査找過程就結(jié)束。
所述的設(shè)定遍歷二叉樹時的順序,具體如下設(shè)置棧s用來存放模式串,指 針p用來跟蹤節(jié)點(diǎn),當(dāng)指針p指向當(dāng)前節(jié)點(diǎn)的右子樹時,棧S的棧頂元素出棧, 右子樹上的元素入棧;當(dāng)指針p指向當(dāng)前節(jié)點(diǎn)的左子樹時,左子樹上的元素直接入棧,重復(fù)上述過程直到P指向葉子節(jié)點(diǎn),此時,棧內(nèi)的元素就是某一個模式串。 例如,訪問模式串"our"的過程如下 第一步S=0; p=0;(根節(jié)點(diǎn)) 第二步S={h}; p=l;(左子樹)
第三步h出棧,O入棧,S={0}; p=10;(右子樹) 第四步U入棧,S={0, U}; p=ll;(左子樹)
第五步r入棧,s={o, u, r}; p=12;(左子樹)
當(dāng)指針P指向葉子節(jié)點(diǎn)結(jié)束。
此時棧s中的字符即為模式串"our"。
本實(shí)施例中根據(jù)模式串集合Oie, hers, his, hour, she, our }構(gòu)造有序二 叉樹,構(gòu)造過程涉及1個節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)和3個子過程。 所述的節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)如下
Structure Node{ Node * Lchild; Char Lxhar;
Node承Rchild; Char Rchar; Node承fatherstate; Node承failstate; Boolean output;
所述的有序二叉樹的構(gòu)造過程如下 輸入信息模式串集合
輸出結(jié)果有序二叉樹、輸出節(jié)點(diǎn)和父狀態(tài)節(jié)點(diǎn)指針
Begin
for each pattern do{ p二root', i二O;
while( (p二goto(p, pattern[i])) !二亂L ) i++; 在p處插入相應(yīng)的pattern [i : strlen (pattern)];End.
所述的goto (state, character)函數(shù)構(gòu)造過程如下根據(jù)設(shè)定的訪問有序二 叉樹的順序,從狀態(tài)節(jié)點(diǎn)state出發(fā)到其任一子狀態(tài)節(jié)點(diǎn)的過程中,如果到達(dá)了 子狀態(tài)節(jié)點(diǎn)child并且此時棧中有且僅有字符char,則goto(state, char)=child,否則goto(state, char)=NULL。該過程的描述如下
輸入信息節(jié)點(diǎn)P,字符char
輸出結(jié)果相應(yīng)的子狀態(tài)
Begin
if ( (char〈p. Lchar) || (p. Lchild==NULL) ){ return圖LU
}else if (char==p. Lchar){ return p. Lchild }else{ p=p. Lchil山
while( (pattern[i]〉p. Rchar) && (p!=NULL) ) p=p. Rchild; if (pattern[i]==p. Rchar) return p. Rchil山
sls6
return亂U
End.
所述的失敗指針構(gòu)造過程如下失敗指針表示在狀態(tài)state時,如果 goto(state, char) = NULL (也就是說,從狀態(tài)state經(jīng)過字符char不可能到 達(dá)state的任一個子狀態(tài)節(jié)點(diǎn)),當(dāng)前狀態(tài)應(yīng)改為state, failstate。失敗指針的 構(gòu)造方式如下
根節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);
狀態(tài)深度為1的節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);
對于狀態(tài)深度大于等于2的節(jié)點(diǎn)s,若其父狀態(tài)為r且goto(r, a)=s。經(jīng)過下列運(yùn)算
while (goto((s. fatherstate). failstate, a)==NULX) s= s. fatherstate; 則s的失敗指針指向狀態(tài)節(jié)點(diǎn)s. fatherstate。
如圖3所示,失敗指針用點(diǎn)線標(biāo)出。每一個狀態(tài)節(jié)點(diǎn)都有一個指針指向一個 失敗狀態(tài)節(jié)點(diǎn)。例如,狀態(tài)節(jié)點(diǎn)2的失敗指針指向狀態(tài)節(jié)點(diǎn)0。 失敗指針的構(gòu)造過程如下 輸入信息有序二叉樹,根節(jié)點(diǎn)是root;
輸出結(jié)果標(biāo)注了失敗指針的右序二叉樹
Build_Fail—Func(Structure Node s) Begin
按上述原則標(biāo)注節(jié)點(diǎn)S的失敗指針;
Build_Fail_Func(s. lxhild); Build一Fail一Func(s. Rchild); End
所述的狀態(tài)深度是指節(jié)點(diǎn)在構(gòu)造過程中的深度,具體如下節(jié)點(diǎn)的狀態(tài)深度 不同于二叉樹的節(jié)點(diǎn)深度,二叉樹的節(jié)點(diǎn)深度是該節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑,而狀態(tài)
深度反映了字符在相應(yīng)的模式串中的位置,狀態(tài)深度按如下方式設(shè)定根節(jié)點(diǎn)的
狀態(tài)深度設(shè)置為0,如果某節(jié)點(diǎn)的狀態(tài)深度是h,則它的左子節(jié)點(diǎn)的狀態(tài)深度設(shè) 置為h+l,右子節(jié)點(diǎn)的狀態(tài)深度設(shè)置為h,依次類推可以確定所有節(jié)點(diǎn)的狀態(tài)深度。 圖2示意了各節(jié)點(diǎn)的狀態(tài)深度。圖2中,圓圈內(nèi)的阿拉伯?dāng)?shù)字表示該節(jié)點(diǎn)的狀態(tài) 深度。
所述的父、子狀態(tài)節(jié)點(diǎn)是指節(jié)點(diǎn)之間的父子關(guān)系,具體如下如果節(jié)點(diǎn)l是
節(jié)點(diǎn)f的左子樹,節(jié)點(diǎn)集合R={r|r是1的右子樹上的節(jié)點(diǎn)并且具有和1相同的狀 態(tài)深度}。則f是l和R中所有節(jié)點(diǎn)的父狀態(tài)節(jié)點(diǎn),1和R中所有節(jié)點(diǎn)是f的子狀 態(tài)節(jié)點(diǎn)。圖2示意了父子狀態(tài)節(jié)點(diǎn)的關(guān)系。圖2中,帶箭頭的點(diǎn)線描述了狀態(tài)節(jié) 點(diǎn)的父子關(guān)系,箭頭端的節(jié)點(diǎn)是末端節(jié)點(diǎn)的父狀態(tài)節(jié)點(diǎn),末端節(jié)點(diǎn)是箭頭端節(jié)點(diǎn) 的子狀態(tài)節(jié)點(diǎn)。
本實(shí)施例中查找階段的操作如下有序二叉樹構(gòu)造完成以后,從字符串中經(jīng) 過一次掃描査出一切與給定模式串集中任何模式串相同的子字符串。査找的過程如下從有序二叉樹的根節(jié)點(diǎn)出發(fā),逐個取出文本串中的字符,根據(jù)goto函數(shù)和 失敗指針的確定下一個狀態(tài)節(jié)點(diǎn)。當(dāng)某狀態(tài)節(jié)點(diǎn)的output域?yàn)檎嬷禃r,輸出結(jié)果。 以本實(shí)施例構(gòu)成的有序二叉樹為例,查找文本串"ushers"的過程如下
從根root開始,goto(root, u)=0. goto(O, s)=13. goto(13, h)=14. goto(14, e)=15.此時輸出節(jié)點(diǎn)15,也就是輸出she,同時輸出節(jié)點(diǎn)2,也就是 輸出he.
接下來,狀態(tài)節(jié)點(diǎn)15的失敗指針指向狀態(tài)節(jié)點(diǎn)2. goto(2, r)=3. goto(3, s)=4.此時輸出狀態(tài)節(jié)點(diǎn)4,也就是輸出hers.此時查找過程結(jié)束。 上述過程可以形式化描述如下 輸入信息-字串string= ".a . 根為root的有序二叉樹。
輸出結(jié)果各個模式以及它們在文本string中出現(xiàn)的位置 p《root
for i <~ 1 until n {
while ( (p二goto(p, a)) 二二 NU1X ) do p《p. failstate if (p. output) {
print i; print p;
if(p. failstate. output) print p. failstate
本實(shí)施例方法構(gòu)造出了有序二叉樹,并用有序二叉樹來代替普通樹型結(jié)構(gòu)實(shí) 現(xiàn)了一種新的多模式匹配方法,即基于有序二叉樹的多模式匹配方法。本實(shí)施例 方法的構(gòu)造速度快,便于動態(tài)增刪節(jié)點(diǎn)(模式串),同時不用額外的轉(zhuǎn)向、失敗和 輸出表,查找效率和傳統(tǒng)方法一樣高。
權(quán)利要求
1、一種基于有序二叉樹的模式匹配方法,其特征在于,包括如下步驟步驟一、構(gòu)造有序二叉樹對二叉樹按NLR方式遍歷,設(shè)定遍歷二叉樹時的順序,得到一系列的模式串,如果這些模式串得到的先后順序和它們的字典序相同,即獲得有序二叉樹,同時在有序二叉樹上構(gòu)造出失敗指針,以重復(fù)利用已經(jīng)匹配成功的模式串子串信息;步驟二、查找階段根據(jù)構(gòu)造的有序二叉樹及goto函數(shù)和失敗指針對源字串進(jìn)行一次查找,定位出模式串在源字串中的位置,查找的過程如下從有序二叉樹的根節(jié)點(diǎn)出發(fā),逐個取出源字串中的字符,根據(jù)goto函數(shù)和失敗指針確定狀態(tài)之間的轉(zhuǎn)換,當(dāng)源字串的所有字符都被取出后,查找過程就結(jié)束。
2、 根據(jù)權(quán)利要求1所述的基于有序二叉樹的模式匹配方法,其特征是,所述 的設(shè)定遍歷二叉樹時的順序,具體如下設(shè)置棧S用來存放模式串,指針p用來 跟蹤節(jié)點(diǎn),當(dāng)指針P指向當(dāng)前節(jié)點(diǎn)的右子樹時,棧S的棧頂元素出棧,右子樹上 的元素入棧;當(dāng)指針p指向當(dāng)前節(jié)點(diǎn)的左子樹時,左子樹上的元素直接入棧,重 復(fù)上述過程直到p指向葉子節(jié)點(diǎn),此時,棧內(nèi)的元素就是某一個模式串。
3、 根據(jù)權(quán)利要求1所述的基于有序二叉樹的模式匹配方法,其特征是,所述 的失敗指針,是指為了重復(fù)利用己經(jīng)匹配成功的子字串信息而使用的一種指針, 具體是指在有序二叉樹的某個狀態(tài)Sl時,應(yīng)用goto函數(shù)將達(dá)到一個新的狀態(tài), 如果goto函數(shù)調(diào)用正確,則到達(dá)狀態(tài)sl某一個子狀態(tài)節(jié)點(diǎn),如果調(diào)用錯誤,則由失敗指針指向一個固定的節(jié)點(diǎn)狀態(tài),以避免重新回到根節(jié)點(diǎn)重新匹配,利用了 已經(jīng)成功匹配的子字串信息。
4、 根據(jù)權(quán)利要求1所述的基于有序二叉樹的模式匹配方法,其特征是,所述失敗指針,其構(gòu)造方式具體如下(1) 根節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);(2) 狀態(tài)深度為1的節(jié)點(diǎn)的失敗指針指向根節(jié)點(diǎn);(3) 對于狀態(tài)深度大于等于2的節(jié)點(diǎn)s,若其父狀態(tài)為r且goto(r, a)=s, s的失敗指針指向的確定是一個遞歸過程,具體如下① 如果goto(s的父狀態(tài)的失敗指針指向的狀態(tài),a)的運(yùn)算結(jié)果不是一個實(shí) 際存在的狀態(tài)時,s重新被賦值為s的父狀態(tài);② 依次循環(huán)步驟a,直到goto(s的父狀態(tài)的失敗指針指向的狀態(tài),a)的運(yùn)算 結(jié)果為一個實(shí)際存在的狀態(tài);③ s的失敗指針被賦值為s的父狀態(tài)。
5、 根據(jù)權(quán)利要求4所述的基于有序二叉樹的模式匹配方法,其特征是,所述 的狀態(tài)深度是指節(jié)點(diǎn)在構(gòu)造過程中的深度,具體如下節(jié)點(diǎn)的狀態(tài)深度不同于二 叉樹的節(jié)點(diǎn)深度,二叉樹的節(jié)點(diǎn)深度是該節(jié)點(diǎn)到根節(jié)點(diǎn)的路徑,而狀態(tài)深度反映 了字符在相應(yīng)的模式串中的位置,狀態(tài)深度按如下方式設(shè)定根節(jié)點(diǎn)的狀態(tài)深度 設(shè)置為0,如果某節(jié)點(diǎn)的狀態(tài)深度是h,則它的左子節(jié)點(diǎn)的狀態(tài)深度設(shè)置為h+l, 右子節(jié)點(diǎn)的狀態(tài)深度設(shè)置為h,依次類推確定所有節(jié)點(diǎn)的狀態(tài)深度。
6、 根據(jù)權(quán)利要求4所述的基于有序二叉樹的模式匹配方法,其特征是,所述的父狀態(tài)節(jié)點(diǎn)、子狀態(tài)節(jié)點(diǎn)之間有節(jié)點(diǎn)之間的父子關(guān)系,具體如下如果節(jié)點(diǎn)1是節(jié)點(diǎn)f的左子樹,節(jié)點(diǎn)集合R={r|r是1的右子樹上的節(jié)點(diǎn)并且具有和1相同的 狀態(tài)深度},則f是1和R中所有節(jié)點(diǎn)的父狀態(tài)節(jié)點(diǎn),l和R中所有節(jié)點(diǎn)是f的子 狀態(tài)節(jié)點(diǎn)。
7、 根據(jù)權(quán)利要求1所述的基于有序二叉樹的模式匹配方法,其特征是,所述 goto函數(shù)是指根據(jù)設(shè)定的遍歷二叉樹時的順序,構(gòu)造狀態(tài)轉(zhuǎn)化的函數(shù),具體如下 按照設(shè)定的遍歷二叉樹的順序,從節(jié)點(diǎn)sl出發(fā)到其任一子狀態(tài)節(jié)點(diǎn)的過程中,如 果到達(dá)了子狀態(tài)節(jié)點(diǎn)s2并且此時棧中有且僅有字符c,則goto函數(shù)被構(gòu)造為 goto(sl, c) = s2,即在狀態(tài)節(jié)點(diǎn)sl,輸入字符c后,將轉(zhuǎn)向狀態(tài)s2。
全文摘要
一種信息技術(shù)領(lǐng)域的基于有序二叉樹的多模式匹配方法,包括如下步驟步驟一、對二叉樹按NLR方式遍歷,設(shè)定遍歷二叉樹時的順序,得到一系列的模式串,如果這些模式串得到的先后順序和它們的字典序相同,即獲得有序二叉樹,同時在有序二叉樹上構(gòu)造出失敗指針,以重復(fù)利用已經(jīng)匹配成功的模式串子串信息;步驟二、根據(jù)構(gòu)造的有序二叉樹及goto函數(shù)和失敗指針對源字串進(jìn)行一次查找,定位出模式串在源字串中的位置,查找的過程如下從有序二叉樹的根節(jié)點(diǎn)出發(fā),逐個取出源字串中的字符,根據(jù)goto函數(shù)和失敗指針確定狀態(tài)之間的轉(zhuǎn)換,當(dāng)源字串的所有字符都被取出后,查找過程就結(jié)束。本發(fā)明特別適用于模式串集合動態(tài)變化的情況。
文檔編號G06F17/30GK101425084SQ200810203008
公開日2009年5月6日 申請日期2008年11月20日 優(yōu)先權(quán)日2008年11月20日
發(fā)明者劉功申, 王士林, 胡佩華 申請人:上海交通大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1