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

建立模式匹配狀態(tài)機(jī)的方法及裝置的制作方法

文檔序號(hào):6458021閱讀:376來源:國知局

專利名稱::建立模式匹配狀態(tài)機(jī)的方法及裝置的制作方法
技術(shù)領(lǐng)域
:本發(fā)明涉及模式匹配技術(shù),具體涉及一種建立模式匹配狀態(tài)機(jī)的方法及裝置。
背景技術(shù)
:模式匹配一般是指在文本數(shù)據(jù)中搜索預(yù)定義的關(guān)鍵字。模式匹配問題是計(jì)算機(jī)科學(xué)中的一個(gè)基本問題,其研究內(nèi)容在信息檢索、模式識(shí)別等眾多領(lǐng)域均有重要價(jià)值,在拼寫檢查、語言翻譯、數(shù)據(jù)壓縮、搜索引擎、入侵檢測、內(nèi)容過濾、計(jì)算機(jī)病毒特征碼匹配以及基因序列比較等應(yīng)用中起著重要的作用。比如,在一些信息獲取、文本編輯應(yīng)用中,用戶會(huì)指定一些關(guān)鍵字,需要在文本中快速定位關(guān)鍵字的位置。Aho-Corasick(阿霍-克若思克)算法描述了一種簡單有效的算法,能夠在任意的文本中定位有限數(shù)目的關(guān)鍵字的所有位置。其原理是首先根據(jù)這一系列關(guān)鍵字定義一個(gè)有限狀態(tài)模式匹配機(jī),然后把文本作為模式匹配機(jī)的輸入。只要匹配到關(guān)鍵字,就會(huì)通報(bào)本關(guān)鍵字匹配成功。以用戶指定關(guān)鍵字集合(he,she,his,hers)為例,用戶希望在文本搜索中出現(xiàn)任一個(gè)關(guān)鍵字,就輸出搜索結(jié)果,通知用戶。如圖1所示,利用Aho-Comsick進(jìn)行模式匹配的過程如下根據(jù)關(guān)鍵字集合(he,she,his,hers》生成Goto函數(shù)、Failure、Output函數(shù),包括兩個(gè)步驟第一步確定狀態(tài)和Goto函數(shù),第二步計(jì)算Failure函數(shù)。Output函數(shù)的構(gòu)建在第一步開始,在第二步完成。如圖l(a)所示,根據(jù)關(guān)鍵字集合生成Goto函數(shù)(在算式中以g代表Goto函數(shù))。Goto函數(shù)g根據(jù)當(dāng)前狀態(tài)和輸入符號(hào)決定遷移狀態(tài)。例如,在0狀態(tài)輸入h會(huì)遷移到l狀態(tài),表示為g(O,h)=l;在狀態(tài)3輸入h會(huì)遷移到狀態(tài)4,表示為g(3,h)=4。如果在某狀態(tài)輸入某個(gè)符號(hào)無法遷移成功,則意味著Goto函數(shù)失敗,結(jié)果以fail表示,如在狀態(tài)3輸入e導(dǎo)致Goto函數(shù)失敗,則表示為g(3,e)=fail。Output函數(shù)表示在某狀態(tài)匹配成功,可以輸出的結(jié)果,如Output(2)="he"。為了構(gòu)建Goto函數(shù),要構(gòu)建一個(gè)goto有向圖。有向圖以一個(gè)代表初始狀態(tài)0的頂點(diǎn)開始,然后輸入關(guān)鍵字到有向圖中,添加一個(gè)從初始狀態(tài)開始的路徑。在添加絲4圣的過程中,新的頂點(diǎn)和邊^(qū)皮添加到了有向圖中,所以/人初始狀態(tài)開始一條路徑能拼出一個(gè)完整的關(guān)鍵字。這條路徑在某個(gè)狀態(tài)終止,這個(gè)狀態(tài)被添加到了Output函數(shù)中。假設(shè)(he,she,his,hers》是關(guān)鍵字集合,生成有限狀態(tài)機(jī)的過程如圖2所示添加第一個(gè)關(guān)鍵字"he,,到有向圖中,得到圖2(a)所示。從狀態(tài)0到狀態(tài)2拼出關(guān)4建字"he,,;將輸出"he"關(guān)聯(lián)到狀態(tài)2上,即Output(2"(he》。將第二個(gè)關(guān)鍵字"she,,添加到有向圖中,得到圖2(b)所示。將輸出"she,,關(guān)聯(lián)到狀態(tài)5,即Output(5"(she》。將第三個(gè)關(guān)鍵字"his"添加到有向圖中,得到如圖2(c)所示。需要注意的是,當(dāng)添加關(guān)4建字"his"時(shí),已經(jīng)有一個(gè)標(biāo)記為h的邊,從狀態(tài)0到狀態(tài)l,所以不需要再添加其他標(biāo)記h的邊從狀態(tài)O到狀態(tài)l。將輸出"his"關(guān)聯(lián)到狀態(tài)7,即Output(7)^his〉。添加最后一個(gè)關(guān)鍵字"hers",得到如圖2(d)所示。輸出"hers,,關(guān)聯(lián)到狀態(tài)9,即Output(9"(hers)。在添加過程中,可以使用已經(jīng)存在的標(biāo)記h的邊(從狀態(tài)0到狀態(tài)1)和標(biāo)記e的邊(從狀態(tài)1到狀態(tài)2)。為了完成Goto函數(shù)的構(gòu)建,還需要添加一個(gè)循環(huán),該循環(huán)從狀態(tài)0到狀態(tài)0,對(duì)應(yīng)于除了h和s外的其他輸入符號(hào)。得到結(jié)果如圖l(a)所示。Failure函數(shù)(在算式中以f代表)表示在某個(gè)狀態(tài)Goto函數(shù)失敗時(shí),應(yīng)該跳轉(zhuǎn)到哪一個(gè)狀態(tài)繼續(xù)進(jìn)行匹配。如圖l(b)所示,在狀態(tài)5,當(dāng)輸入一個(gè)r符號(hào)時(shí),g(5,r)=fail,就要調(diào)用f(5"2處理,即先跳轉(zhuǎn)到狀態(tài)2,然后再調(diào)用g(2,r)處理。因?yàn)镕ailure函數(shù)代表著一個(gè)狀態(tài)向另一個(gè)狀態(tài)的遷移,相當(dāng)于增加了一條鏈在兩個(gè)狀態(tài)之間,一般也可以將某狀態(tài)Failure函數(shù)的指向稱為本狀態(tài)的Failure鏈。Failure函數(shù)基于Goto函數(shù)構(gòu)建。首先定義一個(gè)狀態(tài)s在goto有向圖中的深度,即從初始狀態(tài)到s的最短路徑的長度。在圖l(a),初始狀態(tài)的深度為O,狀態(tài)1和3的深度為1,狀態(tài)2、4、6的深度為2,依此類推。計(jì)算一個(gè)狀態(tài)的Failure函數(shù)f的算法如下先計(jì)算所有深度為1的狀態(tài)的Failure狀態(tài),然后是計(jì)算所有深度為2的狀態(tài)的Failure狀態(tài),一直到所有狀態(tài)7的Failure狀態(tài)都被計(jì)算,則本狀態(tài)機(jī)的Failure函數(shù)構(gòu)建完成。置所有深度為l的狀態(tài)的Failure狀態(tài)為O,現(xiàn)在假設(shè)已經(jīng)計(jì)算出了深度小于d的所有狀態(tài)的Failure狀態(tài),則深度為d的狀態(tài)s的Failure狀態(tài)可以由深度為d-l狀態(tài)的Goto函數(shù)的非fail值推導(dǎo)出來,具體過程如下首先,考慮深度為d-l的每個(gè)狀態(tài)r并執(zhí)行以下處理1.如果對(duì)所有的輸入符號(hào)a,都是g(r,a^fail,則結(jié)束狀態(tài)r的處理。2.否則,對(duì)每個(gè)輸入符號(hào)a產(chǎn)生輸出g(r,a"s的情況,執(zhí)行以下操作(a)設(shè)置狀態(tài)變量state二f(r);(b)執(zhí)行算式state—f(state)(即將f(state)賦值給狀態(tài)變量state)零到多次,直到state的值滿足g(state,a)#fail。(因?yàn)間(O,a)-fail,所以適合的state值總能被發(fā)現(xiàn));(c)"i殳置f(s)二g(state,a)。例如,為了計(jì)算圖l(a)中的Failure函數(shù),應(yīng)該首先設(shè)置f(l)二f(3)二0,因?yàn)?和3是深度為1的狀態(tài)。然后計(jì)算深度2的狀態(tài)2、4、6的Failure函數(shù)。為了計(jì)算f(2),設(shè)置state二f(l"0;因?yàn)間(O,e)=0,所以f(2"0。為了計(jì)算f(6),設(shè)置state二f(l一0;因?yàn)間(0,i)二0,所以f(6)二0。為了計(jì)算f(4),設(shè)置state二f(3"0;因?yàn)間(0,h一l,所以f(4)二l。依照這種思路計(jì)算,就得到完整的Failure函數(shù),如圖l(b)所示。在Failure函數(shù)的計(jì)算過程中,同時(shí)更新Output函數(shù)。當(dāng)確定f(s"s',而狀態(tài)s和s-同時(shí)是Output狀態(tài)時(shí),則將s-的輸出集合并到s的輸出集中。例如,從圖l(a)中,可以確定f(5"2。在這個(gè)點(diǎn)上,合并狀態(tài)2的輸出集(he)到狀態(tài)5,從而得到新的輸出集(he,she}。最終的Output函數(shù)如圖1(c)所示。下面舉例進(jìn)一步說明狀態(tài)機(jī)的匹配過程。以輸入文本,,sshe,,進(jìn)行搜索為例,當(dāng)輸入第一個(gè)s時(shí),g(O,s)=3,所以遷移到狀態(tài)3;輸入第二個(gè)s,Goto函數(shù)失敗,g(3,s)=fail,則調(diào)用Failure函數(shù),f(3)=0表示跳轉(zhuǎn)到狀態(tài)O,然后g(O,s)=3,所以當(dāng)前狀態(tài)仍然是狀態(tài)3;輸入h,g(3,h)=4,遷移到狀態(tài)4;輸入e,g(4,e)=5,遷移到狀態(tài)5;因?yàn)镺utput(5"(she,he},所以本次搜索發(fā)現(xiàn)了{(lán)she,he}兩個(gè)用戶預(yù)定義關(guān)鍵字。在實(shí)現(xiàn)本發(fā)明的過程中,發(fā)明人發(fā)現(xiàn),現(xiàn)有的Aho-Corasick算法至少存在以下問題即有時(shí)Failure到某一狀態(tài)后,Goto函數(shù)仍然失敗,需要繼續(xù)Failure跳轉(zhuǎn)到其他狀態(tài),也就是說,現(xiàn)有的Aho-Corasick算法在Failure鏈處理方面效率低,存在很多低效的Failure鏈。以圖3所示的復(fù)雜狀態(tài)機(jī)為例,其中虛線代表Failure鏈,q0表示初始狀態(tài)。如在ql4狀態(tài)下,g(ql4,e)=fail,只得根據(jù)f(ql4"q27跳轉(zhuǎn)到狀態(tài)q27;但是到了狀態(tài)q27,同樣是g(q27,e)二fail,只得跳轉(zhuǎn)到f(q27"ql9;但仍然是g(q19,e)=fail,只得跳轉(zhuǎn)到f(ql9"q0,即經(jīng)歷了g(q14,e)—〉f(ql4)—>g(q27,e)_>f(q27)_>g(ql9,e)—〉f(q19),才跳轉(zhuǎn)到q0狀態(tài)。再參照?qǐng)D4所示的低效Failure鏈,f(q6)=q0,f(q5)=q4,f(q4)=q3,f(q3)=q2,f(q2)=ql,f(ql)=qO。如果在狀態(tài)q4下輸入符號(hào)c,g(q4,c)=fail,則按f(q4"q3跳轉(zhuǎn)到狀態(tài)q3;但是仍然g(q3,c"fail,則按照f(q3"q2跳轉(zhuǎn)到狀態(tài)q2;但是仍然g(q2,c)=fail,則按照f(q2^ql,跳轉(zhuǎn)到狀態(tài)ql;但是仍然g(ql,c)=fail,則按f(ql^qO跳轉(zhuǎn)到初始狀態(tài)q0,至此才算Failure鏈跳轉(zhuǎn)結(jié)束,即先后經(jīng)過了g(q4,c)—〉f(q3)—>g(q3,c)—>f(q2)—〉g(q2,c)—>f(ql)—〉g(ql,c)—>qO,才跳轉(zhuǎn)到q0狀態(tài)??梢?,Aho-Corasick算法在Failure鏈處理方面是相當(dāng)?shù)托实?,存在著很多低效的Failure鏈。
發(fā)明內(nèi)容本發(fā)明實(shí)施例提供一種建立模式匹配狀態(tài)機(jī)的方法及裝置,以減少模式匹配過程中低效的Failure鏈,提高模式匹配處理效率。本發(fā)明實(shí)施例提供的一種建立模式匹配狀態(tài)機(jī)的方法,包括獲取預(yù)定義的關(guān)鍵字集合;根據(jù)所述關(guān)鍵字集合生成遷移Goto函數(shù);根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入本符號(hào)集合內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失??;才艮據(jù)Goto函數(shù)和Failure函數(shù)生成輸出Output函數(shù)。9本發(fā)明實(shí)施例提供的一種建立模式匹配狀態(tài)機(jī)的裝置,包括獲取單元,用于獲取預(yù)定義的關(guān)鍵字集合;.Goto函數(shù)生成單元,用于根據(jù)所述關(guān)鍵字集合生成Goto函數(shù);Failure函數(shù)生成單元,用于根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入所述輸入符號(hào)集內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失?。籓utput函數(shù)生成單元,用于才艮據(jù)Goto函數(shù)和Failure函數(shù)生成Output函數(shù)。由以上本發(fā)明實(shí)施例提供的技術(shù)方案可以看出,本發(fā)明實(shí)施例的建立模式匹配狀態(tài)機(jī)的方法及裝置,在構(gòu)建Failure函數(shù)時(shí),通過判斷某狀態(tài)的Failure狀態(tài)的可接受輸入集是否是本狀態(tài)可接受輸入集的子集,如果是,則不將該Failure狀態(tài)作為本狀態(tài)的Failure狀態(tài),而是繼續(xù)尋找該Failure狀態(tài)的Failure狀態(tài)進(jìn)行判斷,直到找到一個(gè)適合的狀態(tài)作為本狀態(tài)的Failure狀態(tài),從而消除了依照現(xiàn)有技術(shù)建立的模式匹配狀態(tài)機(jī)中低效的Failure鏈,提高了模式匹配的處理效率。圖l是現(xiàn)有技術(shù)中根據(jù)關(guān)鍵字構(gòu)建Goto、Failure、Output函數(shù)示意圖2是現(xiàn)有技術(shù)中有限狀態(tài)機(jī)生成過程示意圖3是現(xiàn)有技術(shù)中的復(fù)雜狀態(tài)機(jī)示意圖4是現(xiàn)有技術(shù)中的低效Failure鏈?zhǔn)疽鈭D5是本發(fā)明實(shí)施例建立模式匹配狀態(tài)機(jī)的方法的流程圖6是本發(fā)明實(shí)施例中生成Failure函數(shù)的流程圖7是根據(jù)本發(fā)明實(shí)施例的方法生成的對(duì)應(yīng)于圖4的Failure鏈?zhǔn)疽鈭D8是本發(fā)明實(shí)施例建立模式匹配狀態(tài)機(jī)的裝置的原理框圖。具體實(shí)施方式和實(shí)施方式對(duì)本發(fā)明實(shí)施例作緣一步的詳細(xì)說明。參照?qǐng)D5,圖5示出了本發(fā)明實(shí)施例建立模式匹配狀態(tài)機(jī)的方法的流程,包括以下步驟步驟501,獲取預(yù)定義的關(guān)鍵字集合;步驟502,根據(jù)所述關(guān)鍵字集合生成Goto函數(shù);生成Goto函數(shù)的過程與現(xiàn)有技術(shù)相同,在此不再贅述;步驟503,根據(jù)生成的Goto函數(shù)構(gòu)建Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入本符號(hào)集合內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失敗;也就是說,在構(gòu)建Failure函數(shù)時(shí),如果f(s)=s',但是狀態(tài)s'的可接受輸入集是狀態(tài)s可接受輸入集的子集,則狀態(tài)s'不能作為狀態(tài)s的Failure狀態(tài),應(yīng)該繼續(xù)尋找狀態(tài)s'的Failure狀態(tài)來做判斷,直到找到一個(gè)適合的狀態(tài)作為狀態(tài)s的Failure狀態(tài);在具體實(shí)現(xiàn)時(shí),要判斷s'的可接受輸入集是否是s的可接受輸入集的子集,只要看是否存在一個(gè)符號(hào)b,能使得g(s',b)弁ail,但是g(s,b)-fail。如果存在符號(hào)b,則說明不是子集;否則說明是子集;步驟504,根據(jù)Goto函數(shù)和Failure函數(shù)生成Output函數(shù);生成Goto函數(shù)的過程與現(xiàn)有技術(shù)相同,在此不再贅述。在具體實(shí)現(xiàn)時(shí),可以按照以下過程根據(jù)生成的Goto函數(shù)構(gòu)建Failure函數(shù)先直接設(shè)置所有深度為1的狀態(tài)的Failure狀態(tài)為初始狀態(tài)0,然后是根據(jù)深度為1的狀態(tài)的Failure狀態(tài)計(jì)算所有深度為2的狀態(tài)的Failure狀態(tài),接著根據(jù)深度為2的狀態(tài)的Failure狀態(tài)計(jì)算深度為3狀態(tài)的Failure狀態(tài),......,一直到所有狀態(tài)的Failure狀態(tài)都被計(jì)算(除了初始狀態(tài)0的Failure狀態(tài)沒有定義),則Failure函數(shù)構(gòu)建完成。首先置所有深度為1的狀態(tài)的Failure狀態(tài)為0。現(xiàn)在假設(shè)已經(jīng)計(jì)算出了深度小于d的所有狀態(tài)的Failure狀態(tài),則深度為d的狀態(tài)的Failure狀態(tài)可以由深度為d-1狀態(tài)的Goto函數(shù)的非fail值推導(dǎo)出來。為了計(jì)算深度d的狀態(tài)s的Failure函數(shù),先考慮深度為d-l的每個(gè)狀態(tài)r并執(zhí)行以下動(dòng)作1.如果對(duì)所有的輸入符號(hào)a,都是g(r,a^fail,則結(jié)束狀態(tài)r的處理。2.否則,對(duì)每個(gè)輸入符號(hào)a產(chǎn)生輸出g(r,a"s的情況,執(zhí)行以下操作(a)設(shè)置狀態(tài)變量state二f(r);(b)執(zhí)行算式state—f(state)零到多次,直到state的值滿足以下兩個(gè)條件之一(i)s'=0(s'—g(state,a),0^戈表初始狀態(tài));(ii)s^fail(因?yàn)間(O,a)弁ail,所以適合的state值總能^C^現(xiàn)),并且存在一個(gè)輸入符號(hào)b使得g(s',b)#fail和g(s,b)=fail(因?yàn)間(O,b)雄il,所以適合的state值總能被發(fā)現(xiàn));或者s'#ail,state=0,則直接設(shè)置s'=0;(c)設(shè)置f(s)=s',即將s'作為深度d的狀態(tài)s的Failure函數(shù)值。通過上述步驟(b),可以保證s'的可接受輸入集不是s的可接受輸入集的子集,從而在構(gòu)建Failure函數(shù)時(shí)避免了產(chǎn)生低效的Failure鏈。下面以一個(gè)具體編程實(shí)現(xiàn)Failure函數(shù)的過程來說明,將狀態(tài)集合以隊(duì)列的方式來逐個(gè)計(jì)算各狀態(tài)的Failure狀態(tài),通過圖6所示流程來完成,主要包括以下步驟步驟601,定義一個(gè)狀態(tài)集合queue,并將其清空。步驟602,遍歷輸入符號(hào)集,所述輸入符號(hào)集包含本模式匹配狀態(tài)機(jī)可以使用的所有輸入符號(hào)。該輸入符號(hào)可以是包含單個(gè)字符的符號(hào),也可以是包含多個(gè)字符的符號(hào)。為了便于清楚說明,本實(shí)施例以單個(gè)字符的符號(hào)為例。比如,對(duì)于輸入符號(hào)集中的一個(gè)符號(hào)a,如果存在g(0,a)=s#0,則將此狀態(tài)放入狀態(tài)集合queue中,并置狀態(tài)s的Failure值為0。本步驟是一個(gè)循環(huán)的過程,通過遍歷輸入符號(hào)集,可以將深度為1的狀態(tài)全部找出來,將它們?nèi)糠湃霠顟B(tài)集合queue中,并將它們的Failure狀態(tài)都置為狀態(tài)0。步驟603,循環(huán)遍歷狀態(tài)集合queue。如果此時(shí)queue為空,則執(zhí)行步驟614;否則執(zhí)行步驟604。步驟604,從狀態(tài)集合queue中取出第一個(gè)狀態(tài)處理,并將此狀態(tài)從狀態(tài)集合queue中刪除,下面以取出狀態(tài)r為例。步驟605,遍歷輸入符號(hào)集來發(fā)現(xiàn)狀態(tài)r的下聯(lián)狀態(tài),如果輸入符號(hào)集已經(jīng)對(duì)狀態(tài)r遍歷完畢,則返回步驟603;否則執(zhí)行步驟606。步驟606,對(duì)于符號(hào)集中的一個(gè)符號(hào)a,如果存在g(r,a)=s#fail,表明在狀態(tài)機(jī)中r狀態(tài)的下聯(lián)狀態(tài)為s,則將狀態(tài)s放入狀態(tài)集合queue中,用于后續(xù)處理狀態(tài)s的下聯(lián)狀態(tài);狀態(tài)r的Failure狀態(tài)在以前的處理中已經(jīng)生成,用變量state來i己錄狀態(tài)r的Failure^1犬態(tài)。步驟607,判斷在狀態(tài)state輸入符號(hào)a時(shí)Goto函數(shù)是否為0;如果是,則執(zhí)行步驟613;否則,執(zhí)行步驟608。步驟608,判斷在狀態(tài)state輸入符號(hào)a時(shí)Goto函數(shù)是否失敗。因?yàn)閒(s)-g(state,a),f(s)的值應(yīng)該是一個(gè)有意義的狀態(tài),不能是fail,所以要預(yù)先判斷g(state,a)是否為fail。如果是fail,即遷移失敗,則執(zhí)行步驟611;否則扭i行步驟609。步驟609,判斷狀態(tài)s'的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集;如果是,則某符號(hào)在狀態(tài)s下遷移失敗,在狀態(tài)s'下遷移也肯定失敗,所以狀態(tài)s'不能作為狀態(tài)s的Failure狀態(tài),則執(zhí)行步驟610;否則,執(zhí)行步驟613。上述s'=g(state,a),可以按照以下方式判斷狀態(tài)s'的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集遍歷輸入符號(hào)集,看是否存在一個(gè)符號(hào)b,使得g(g(state,a),b)#fail,但是g(s,b)=fail。如果存在符號(hào)b,說明狀態(tài)s'的可接受輸入集不是狀態(tài)s的可接受輸入集的子集,否則說明子集存在。步驟610,判斷狀態(tài)state是否為0;如果是,則執(zhí)行步驟612;否則,執(zhí)行步驟611。步驟611,如果某一狀態(tài)不能作為另一狀態(tài)的Failure狀態(tài),應(yīng)該跳轉(zhuǎn)到這一狀態(tài)的Failure狀態(tài)繼續(xù)嘗試,即以state的Failure狀態(tài)作為新的state狀態(tài)來做嘗試,然后返回步驟607繼續(xù)進(jìn)行判斷。步驟612,直接設(shè)置狀態(tài)s的Failure狀態(tài)為0,即f(s"0;然后返回步驟605,搜索狀態(tài)r下的其他下聯(lián)狀態(tài)。步驟613,得出狀態(tài)s的Failure狀態(tài),即f(s)—g(state,a);然后返回步驟605,搜索狀態(tài)r下的其他下聯(lián)狀態(tài)。步驟614,狀態(tài)集合queue隊(duì)列為空,表明本狀態(tài)機(jī)所有狀態(tài)已經(jīng)_處理完畢,F(xiàn)ailure函數(shù)已經(jīng)構(gòu)建完成。需要說明的是,在上述流程中,輸入符號(hào)a、b表示輸入符號(hào)集中的任意一個(gè)符號(hào),而不特指其本身所表示的符號(hào)a、b。本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,所述的存儲(chǔ)介質(zhì),如ROM/RAM、磁碟、光盤等。下面以圖4所示的Failure鏈為例,對(duì)利用現(xiàn)有^支術(shù)及本發(fā)明方法生成的Failure結(jié)果進(jìn)行比較,進(jìn)一步說明利用本發(fā)明方法減少低效的Failure鏈的效果。計(jì)算結(jié)果如下表l所示:步驟原有算法Failure結(jié)果本專利算法Failure結(jié)果l.置所有深度為1的狀態(tài)的Failurey夫態(tài)為初始狀態(tài)f(ql)=q。f(qi)=q02.生成深度為2的狀態(tài)的Failure狀態(tài)state=f(ql)=qO,f(q2)=g(q0,a)=ql。state二f(q1)=q0,s'=g(state,a)二ql弁ail,因?yàn)閝l和q2的可接受輸入集都是(a),所以不存在一個(gè)b使得g(s',b)^fail和g(s,b)=fail,而且state二f(ql"qO所以直接設(shè)置s'=q0,得到f(q2)=q0。3.生成深度為3的狀態(tài)的Failure狀態(tài)state=f(q2)=ql,f(q3)=g(ql,a)=q2。state=f(q2)=ql,不滿足(i)、(ii)任意條件,所以執(zhí)行state—f(state)=f(ql)=qO。從步驟2可以看出因?yàn)閝l滿足14<table>tableseeoriginaldocumentpage15</column></row><table>表1最后,按照現(xiàn)有技術(shù)生成的Failure鏈如圖4所示,對(duì)應(yīng)于圖4,按照本發(fā)明方法生成的Failure鏈如圖7所示。在上述實(shí)施例中,以單個(gè)字符的符號(hào)為例詳細(xì)說明了實(shí)現(xiàn)Failure函數(shù)的過程,本發(fā)明實(shí)施例并不限于這種情況,同樣可以適用于輸入多個(gè)字符組成的符號(hào)的情況。可見,利用本發(fā)明實(shí)施例的方法建立模式匹配狀態(tài)機(jī)時(shí),可以大大減少低效的Failure鏈,提高模式匹配處理效率。本發(fā)明實(shí)施例還提供了一種建立模式匹配狀態(tài)機(jī)的裝置,如圖8所示,該裝置包括獲取單元81、Goto函數(shù)生成單元82、Failure函數(shù)生成單元83和Output函數(shù)生成單元84。其中,獲取單元81用于獲取預(yù)定義的關(guān)鍵字集合;Goto函數(shù)生成單元82用于根據(jù)所述關(guān)鍵字集合生成Goto函數(shù);Failure函數(shù)生成單元83用于根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入本符號(hào)集合內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失?。籓utput函數(shù)生成單元84用于根據(jù)Goto函數(shù)和Failure函數(shù)生成Output函數(shù)。如圖8所示,在本發(fā)明的一種實(shí)施例中,F(xiàn)ailure函數(shù)生成單元83包括設(shè)置子單元831、狀態(tài)獲取子單元832和Failure狀態(tài)生成子單元833。其中,設(shè)置子單元831用于設(shè)置所有深度為1的狀態(tài)的Failure狀態(tài)為初始狀態(tài);狀態(tài)獲取子單元832用于依次獲取前一深度d-1的狀態(tài)r的Failure狀態(tài)作為當(dāng)前狀態(tài)state;Failure狀態(tài)生成子單元833用于遍歷輸入符號(hào)集,判斷在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)是否失敗,和所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集;并在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)失敗,或者所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是當(dāng)前深度d的狀態(tài)s的可接受輸入集的子集時(shí),將所述當(dāng)前狀態(tài)state的Failure狀態(tài)作為新的所述當(dāng)前狀態(tài)繼續(xù)上述判斷;在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集時(shí),將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài);在狀態(tài)r輸入所有的輸入符號(hào),Goto函數(shù)均為失敗時(shí),結(jié)束對(duì)狀態(tài)r的處理。Failure狀態(tài)生成子單元833可以按照以下過程判斷所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)S的可接受輸入集的子集遍歷輸入符號(hào)集,如果存在滿足以下條件的符號(hào)b:g(g(state,a),b)^fail,并且g(s,b)二fail,其中a是在深度為d-1的狀態(tài)r時(shí)的輸入符號(hào),則確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集;否則,確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集。如圖8所示,在該實(shí)施例的建立模式匹配狀態(tài)機(jī)的裝置中,還可以包括第一判斷單元85,用于判斷所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)為0時(shí),將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài),除此之外,還可以包括第二判斷單元86,用于判斷在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集,并且所述當(dāng)前狀態(tài)state為0時(shí),直接設(shè)置深度為d的狀態(tài)s的Failure狀態(tài)為0。利用本發(fā)明實(shí)施例的裝置建立模式匹配狀態(tài)機(jī)的具體過程與前面對(duì)本發(fā)明方法的描述類似,在此不再贅述。利用本發(fā)明實(shí)施例的裝置建立的模式匹配狀態(tài)機(jī),可以消除模式匹配狀態(tài)機(jī)中低效的Failure鏈,提高模式匹配的處理效率。以上對(duì)本發(fā)明實(shí)施例進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體實(shí)施方式對(duì)本發(fā)明進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的裝置及方法;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本發(fā)明的限制。1權(quán)利要求1、一種建立模式匹配狀態(tài)機(jī)的方法,其特征在于,包括獲取預(yù)定義的關(guān)鍵字集合;根據(jù)所述關(guān)鍵字集合生成遷移Goto函數(shù);根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入本符號(hào)集合內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失??;根據(jù)Goto函數(shù)和Failure函數(shù)生成輸出Output函數(shù)。2、根據(jù)權(quán)利要求1所述的方法,其特征在于,所述根據(jù)生成的Goto函數(shù)構(gòu)建Failure函數(shù)包括設(shè)置所有深度為1的狀態(tài)的Failure狀態(tài)為初始狀態(tài),并用狀態(tài)O表示所述初始狀態(tài);依次對(duì)深度為d-1的狀態(tài)r執(zhí)行以下步驟,以確定深度為d的狀態(tài)s的Failure狀態(tài)獲取深度為d-1的狀態(tài)r的Failure狀態(tài)作為當(dāng)前狀態(tài)state,并執(zhí)行以下步驟遍歷輸入符號(hào)集,判斷在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)是否失敗,和所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集,所述輸入符號(hào)集包含本模式匹配狀態(tài)機(jī)可以使用的所有輸入符號(hào);如果在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)失敗,或者所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集,則將所述當(dāng)前狀態(tài)state的Failure狀態(tài)作為新的所述當(dāng)前狀態(tài)繼續(xù)上述判斷步驟;如果在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集,則將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài);如果在狀態(tài)r輸入所有的輸入符號(hào)時(shí),Goto函數(shù)均為失敗,則結(jié)束狀態(tài)r的處理。3、根據(jù)權(quán)利要求.2所述的方法,其特征在于,所述判斷所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集的過程包括遍歷所述輸入符號(hào)集,如果存在滿足以下條件的符號(hào)b:g(g(state,a),b)^fail,并且g(s,b)=fail,其中a是在深度為d-1的狀態(tài)r時(shí)的輸入符號(hào),則確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集;否則,確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集。4、根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述方法還包括如果在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)值為0,則將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài)。5、根據(jù)權(quán)利要求2或3所述的方法,其特征在于,所述方法還包括如果在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集,并且當(dāng)前狀態(tài)state為0,則直接設(shè)置深度為d的狀態(tài)s的Failure狀態(tài)為0。6、一種建立模式匹配狀態(tài)機(jī)的裝置,其特征在于,包括獲取單元,用于獲取預(yù)定義的關(guān)鍵字集合;Goto函數(shù)生成單元,用于根據(jù)所述關(guān)鍵字集合生成Goto函數(shù);Failure函數(shù)生成單元,用于根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入所述輸入符號(hào)集內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失?。籓utput函數(shù)生成單元,用于才艮據(jù)Goto函數(shù)和Failure函凄t生成Output函數(shù)。7、根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述Failure函數(shù)生成單元包括設(shè)置子單元,用于設(shè)置所有深度為l的狀態(tài)的Failure狀態(tài)為初始狀態(tài);狀態(tài)獲取子單元,用于依次獲取前一深度d-l的狀態(tài)r的Failure狀態(tài)作為當(dāng)前狀態(tài)state;Failure狀態(tài)生成子單元,用于遍歷所述輸入符號(hào)集,判斷在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)是否失敗,和所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集;并在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)失敗,或者所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是當(dāng)前深度d的狀態(tài)s的可接受輸入集的子集時(shí),將所述當(dāng)前狀態(tài)state的Failure狀態(tài)作為新的所述當(dāng)前狀態(tài)繼續(xù)上述判斷;在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集時(shí),將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài);在狀態(tài)r輸入所有的輸入符號(hào),Goto函數(shù)均為失敗時(shí),結(jié)束對(duì)狀態(tài)r的處理。8、根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述Failure狀態(tài)生成子單元按照以下過程判斷所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是否是狀態(tài)s的可接受輸入集的子集遍歷所述輸入符號(hào)集號(hào),如果存在滿足以下條件的符號(hào)b:g(g(state,a),b)-fail,并且g(s,b)=fail,其中a是在深度為d-l的狀態(tài)r時(shí)的輸入符號(hào),則確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集;否則,確定所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集是狀態(tài)s的可接受輸入集的子集。9、根據(jù)權(quán)利要求7或8所述的裝置,其特征在于,所述裝置還包括第一判斷單元,用于判斷所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)為0時(shí),將所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)值作為深度為d的狀態(tài)s的Failure狀態(tài)。10、根據(jù)權(quán)利要求7或8所述的方法,其特征在于,所述裝置還包括第二判斷單元,用于判斷在所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)Goto函數(shù)不是失敗,并且所述當(dāng)前狀態(tài)state輸入所述輸入符號(hào)時(shí)的Goto函數(shù)得到的遷移狀態(tài)的可接受輸入集不是狀態(tài)s的可接受輸入集的子集,并且所述當(dāng)前狀態(tài)state為0時(shí),直接設(shè)置深度為d的狀態(tài)s的Failure狀態(tài)為0。全文摘要本發(fā)明公開了一種建立模式匹配狀態(tài)機(jī)的方法及裝置,該方法包括獲取預(yù)定義的關(guān)鍵字集合;根據(jù)所述關(guān)鍵字集合生成遷移Goto函數(shù);根據(jù)生成的Goto函數(shù)構(gòu)建失敗Failure函數(shù),并使各狀態(tài)的Failure狀態(tài)的可接受輸入集不是本狀態(tài)的可接受輸入集的子集,所述狀態(tài)的可接受輸入集表示在所述狀態(tài)下輸入本符號(hào)集合內(nèi)任意符號(hào)時(shí),該狀態(tài)的Goto函數(shù)不會(huì)失?。桓鶕?jù)Goto函數(shù)和Failure函數(shù)生成輸出Output函數(shù)。利用本發(fā)明,可以減少模式匹配過程中低效的Failure鏈,提高模式匹配處理效率。文檔編號(hào)G06F17/30GK101499064SQ20081000607公開日2009年8月5日申請(qǐng)日期2008年2月1日優(yōu)先權(quán)日2008年2月1日發(fā)明者建陳,陳國海,魏啟坤申請(qǐng)人:華為技術(shù)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1