常用字串搜尋演算法 z

2021-08-31 20:13:16 字數 2741 閱讀 1945

from: 

字串搜尋或匹配是經常用到的技術,因此也發展了多個演算法,介紹幾個著名的演算法。

1.單模式匹配

就是在一些文字中查詢某乙個子字串的演算法,效率較高的有以下幾種。

kmp演算法:全稱knuth-morris-pratt演算法 預處理時間θ(m) 匹配搜尋時間 θ(n)

bm演算法:全稱boyer-moore string search algorithm 預處理時間θ(m + |σ|) 匹配搜尋時間ω(n/m), o(n)

2. 有限模式集合匹配

就是在字串中查詢多個子字串的演算法,常用於查詢字典中的單詞和一些髒字匹配演算法

aho-corasick演算法:這是一種字典匹配演算法,它用於在輸入文字中查詢字典中的字串。時間複雜度是線性的。

基本原理:該演算法利用類似字尾樹的方法構造乙個trie結構,匹配時利用該結構來搜尋。

commentz-walter 演算法:詳細未知

rabin-karp string search演算法:該演算法最差複雜度不好,因此運用的並不廣泛。

*************************====

字串多模匹配演算法之ac自動機理解心得

absolute8511 總結於 2009-2-26

ac自動機演算法全稱aho-corasick演算法

,是一種字串多模式匹配演算法。用於在一段文字中查詢多個模式字串。最近看到這個演算法的一些文章,由於理解能力有限,琢磨了許久才有一些眉目,故記下此時的理解過程,防止過久了又要琢磨許久才能理解,也希望能幫助其他人加深理解,如有理解不當之處還望指出修正。^_^

總結如下:

該演算法有兩個主要步驟,乙個是字典樹的構造,乙個是搜尋路徑的確定。

1. 字典樹的構造

這個比較好理解,就是把要匹配的一些字串新增到樹結構中去,樹邊就是單詞中的字元,單詞中最後乙個字元的連線節點新增標誌,以表示改節點路徑包含1個字典中的字串,搜尋到此節點就表示找到了字典中的某個單詞,可以直接輸出。

例子:某字典p={he,she,his,hers}對應的字典樹如下圖:

圖中有數字的節點到根節點的路勁正好對應字典中的字串,數字表述單詞在字典中的順序,也可以是其他標誌。

2. 搜尋路徑的確定

就是這部分我琢磨了很久,我的理解是 利用字尾字串來確定。字尾字串就是某個字串的後面的一部分。比如abcde的字尾字串有bcde,cde,de和e。

假定目標字串為ushers,字典為上圖所示。

搜尋過程目標字串指標指向的字元和字典中的字元會有以下幾種情況:

a. 當前字元匹配,表示從當前節點沿著樹邊有一條路徑可以到達目標字元,此時只需沿該路徑走向下乙個節點繼續匹配即可,目標字串指標移向下個字元繼續匹配;

如:當指標指到s處,此時字典樹指標處於根,要從根到s處,可以看到圖中有一條從根經s連線到的節點,因此字典樹節點指標指向此節點,目標字串指標移動到下一字元h繼續匹配;顯然當前節點有一條經h連線到的節點,於是重複操作到有數字標誌的節點2處,表示已找到,該匹配字串就是"she",輸出該字串的位置後,目標字串指標增1指向"r",字典指標指向數字2節點,進行下次匹配。

b. 當前字元無匹配,表示當前節點的任何一條邊都無法達到要匹配的字元,此時不能沿現有路徑前進,只能回溯,回溯到存在的最長的字尾字串處,如果沒有任何字尾字串匹配則回溯到樹根處。然後從當前回溯節點判斷是否可以到達目標字串字元。

如:接上,由於數字2節點無經"r"的連線,因此回溯,she的字尾字串he在字典樹中,因此字典樹指標指向帶有數字1的標誌節點,由於帶有標誌,直接輸出該節點"he"(存疑,很多文章沒有提到此處需要輸出,正常路徑移動的字典指標節點要判斷是否可以輸出,那麼由回溯路徑改變的字典指標指向的節點要不要判斷是否輸出?),然後從數字1節點判斷是否有經"r"到下一節點的路徑,顯然圖中有。因此字典樹節點指向下一節點,重複以上操作,最後找到"hers",此時匹配搜尋也結束了。

以上兩種情況直到目標字串指標直到末尾結束匹配。在匹配過程中遇到有標誌的節點說明找到了字典中的某個詞,可以直接輸出。

更新:輸出說明:每次目標串指標移動前都需要判斷當前節點是否可以輸出,並遞迴的判斷當前節點回溯路徑上的節點是否可以輸出(其實就是判斷所有字尾字串,she匹配時,其字尾he也會匹配,即使she不匹配,其字尾he也可能匹配,因此需遞迴判斷字尾字串),直到樹根結束遞迴。

由於固定字典的字串的字尾字串都是已知的,因此可以在字典樹結構中儲存匹配失敗的路徑方向,因此只要字典樹構造完畢,就可以根據字典樹的路徑進行匹配了,效率非常快。以上就是我對該演算法的全部過程的理解,疏漏之處在所難免。

附1:含匹配失敗的情況的路徑選擇的字典樹,實線表示匹配成功的正常路徑,虛線表示失敗的回溯路徑

附2:偽**實現

t為目標字串,長度為m,q為字典樹的節點指標,g函式返回從節點q經過路徑t[i]到達的下一節點指標,f函式返回節點q的回溯節點指標。flag判斷節點是否為標誌節點

q := 0; // initial state (root)

for i := 1 to m do

while g(q,t[i]) = null do

q := f(q); // 回溯

q := g(q,t[i]); // 前進

node:=q;

while(node!=root)

endfor;

參考資料:biosequence algorithms, spring 2005 lecture 4: set matching and

aho-corasick algorithm. pekka kilpelainen

常用字串演算法

一 判斷兩個字串是否包含相同的內容 1.巧用陣列下標實現,把用字元的ascii碼值當作下標,記錄出現的字元,然後對兩字串進行遍歷 判斷s於s2是否相同 param s param s2 return boolean static boolean equals string s,string s2 四...

mysql常用字串 MYSQL常用字串函式寶典

mysql常用字串函式 想更進一步加強自己在查詢語句方面的能力,需要掌握常用函式。字串函式 1 concat s1,s2,sn 將s1,s2,sn串聯成乙個字串。exp root test 14 43 desc t1 field type null key default extra id int ...

常用字串hash演算法

以前學習資料結構中有關hash部分的時候一帶而過,現在真正在實踐中用到的時候才感受到hash的魅力。hdoj1800可作為練習 以下是常用字串hash演算法的簡單對比分析 hash函式 資料1資料2 資料3資料4 資料1分數 資料2分數 資料3分數 資料4分數 平均rshash10 4861 505...