字串匹配演算法 利用有限自動機進行匹配

2021-06-20 19:10:42 字數 1253 閱讀 2867

本文內容與《演算法導論》中字串匹配章節相關並部分摘錄。

常用的字串匹配演算法有樸素字串匹配演算法,rabin-karp演算法,利用有限自動機進行字串匹配和kmp演算法等。前面兩種比較簡單,重點是後面兩種。

利用有限自動機進行字串匹配

假設要對文字字串t進行掃瞄,找出模式p的所有出現位置。這個方法可以通過一些辦法先對模式p進行預處理,然後只需要對t的每個文字字元檢查一次,並且檢查每個文字字元所用時間為常數,所以在預處理建好自動機之後進行匹配所需時間只是θ(n)。

假設文字長度為n,模式長度為m,則自動機將會有0,1,...,m這麼多種狀態,並且初始狀態為0。先拋開自動機是怎樣計算出來的細節,只關注自動機的作用。在從文字從左到右掃瞄時,對於每乙個字元a,根據自動機當前的狀態還有a的值可以找出自動機的下乙個狀態,這樣一直掃瞄下去,並且一定自動機狀態值變為m的時候我們就可以認為成功進行了一次匹配。先看下面簡單的例子:

假設現在文字和模式只有三種字元a,b,c,已**本t為"abababaca",模式p為"ababaca",根據模式p建立自動機如下圖(b)(先不管實現細節):

如圖(c),對照自動機轉換圖(b),乙個個的掃瞄文字字元,掃瞄前狀態值初始化為0,這樣在i = 9的時候狀態值剛好變成7 = m,所以完成乙個匹配。

現在問題只剩下怎樣根據給出的模式p計算出相應的乙個自動機了。這個過程實際上並沒有那麼困難,下面只是介紹自動機的構建,而詳細的證明過程可以參考書本。

還是用上面的那裡例子,建立模式p = "ababaca"的有限自動機。首先需要明白一點,如果當前的狀態值為k,其實說明當前文字的字尾與模式的字首的最大匹配長度為k,這時讀進下乙個文字字元,即使該字元匹配,狀態值最多變成k + 1.假設當前狀態值為5,說明文字當前位置的最後5位為"ababa",等於模式的前5位。

如果下一位文字字元是"c",則狀態值就可以更新為6.如果下一位是"a",這時我們需要重新找到文字字尾與模式字首的最大匹配長度。簡單的尋找方法可以是令k = 6(狀態值最大的情況),判斷文字後k位與模式前k位是否相等,不等的話就k = k - 1繼續找。由於剛才文字後5位"ababa"其實就是模式的前5位,所以實際上構建自動機時不需要用到文字。這樣可以找到這種情況狀態值將變為1(只有a一位相等)。同理可以算出下一位是"b"時狀態值該變為4(模式前4位"abab"等於"ababab"的字尾)

下面是書本偽**:∑代表字符集,δ(q,a)可以理解為讀到加進字元a後的狀態值

用上面的方法計算自動機,如果字元種數為k,則建立自動機預處理的時間是o(m ^ 3 * k),有方法可以將時間改進為o(m * k)。預處理完後需要θ(n)的處理時間。

利用有限自動機進行字串匹配

乙個有限自動機m是乙個5元組,q,q0,f,m,g q 狀態的集合,q0 開始狀態,f接收狀態,m字符集,g 轉換函式 文字字串t,匹配模式p 1,2,3.m 每乙個匹配模式都有乙個對應的有限自動機,將字串t按序輸入到自動機中,如果到達接受狀態,則匹配成功,下面介紹如何為p構造自動機。1.狀態集合q...

利用有限自動機進行字串匹配

字串匹配演算法有四種 1.樸素演算法,預處理o 0 匹配時間o n m 1 m 其中n是文字長度,m是模式長度 2.rabin karp演算法,預處理o m 匹配時間同樸素演算法 3.有限自動機演算法,預處理o m 匹配時間o n 4.kmp演算法,預處理o m 匹配時間o n 這裡討論的是有限自動...

字串匹配 有限自動機

有限自動機包含乙個五元組 q,q0,a,q表示狀態有限集 q0為初始狀態 q0 q a表示接受狀態的集合 a 是q的子集 是輸入字母表 是狀態轉移函式 對於終態函式我還不是很理解,希望大家不吝賜教 演算法導論上有乙個例子 p ababaca 那麼轉換成五元組是 q q0 0 注 0狀態什麼都沒有 a...