關於AC自動機的正確性的證明

2021-06-01 18:50:34 字數 1969 閱讀 6548

沒錯,ac自動機是敲出來了,但是它為什麼就能統計出所有的單詞呢?

比如有很多串,zzhxr,zzx,hxr,hsr,shr,zhs,還有乙個主串,zzxhxrszzhxrssszzhs(t),現在要統計前面的那些串有多少在主串中出現。思考一下。

首先,有乙個很樸素的演算法,也是乙個很簡單的方法,先對zzhxr,zzx,hxr,hsr,shr,zhs,這幾個串,建乙個字典樹。設乙個指標x,x從 t 的開頭一直遍歷到 t 的結尾,對於 x 的每乙個位置,統計以所有以x開頭的單詞是否在字典樹中出現,出現的話就就在字典樹中把那個節點記錄是否有單詞的那個值標記為 false 。這是乙個很簡單的過程。我們先來證明這種方法可以找完所有的單詞。

請先思考,如果有乙個串(把這個串記為 a)在主串(t)中出現,那麼在主串(t)中一定可以找到兩個指標,*p和*q,p指向串 a 的第乙個位置,q指向串a的最後乙個位置。這個是一定的吧,這說明如果串a是出現的,那麼一定能在t中找到,這說明前面說的那種方法統計出的單詞的數目大於等於出現過的單詞的數目,(這句話聽起來很拗口,怎麼可能會比出現的多呢,直覺告訴我們絕對不可能,呵呵,確實是的,但是證明的過程要求的是嚴謹,對於這種顯而易見的結論我們也要證明)。同樣的如果在主串(t)中找到乙個單詞,那麼它必然在字典樹中出現(這確實是廢話),這又說明這種方法統計出的單詞數目小於等於出現過單詞的數目(那麼他們就相等了,對吧)。綜上所述,這種方法最終計算出來的就是我們需要的結果。

不急,這些只是熱身,

真正的證明現在開始。

我們來證明ac自動機自動ac的過程和上述方法的過程是等價的。

同樣的,我們在主串(t)上設兩個指標,*p和*q,表示在字典樹上已經匹配的一段字串(ac自動機真正的實現並不是這樣的,這樣只是為了更好地表達),開始的時候p和q都指向主串(t)的開始位置,q向後移動一位,進行第一次插入,如果成功,p指標不動,並且,呼叫p指標的fail指標或者out指標(我的**裡是新增了out指標的,其實理論上可以不新增,新增後只是優化下時間而已),這樣的話,對於可以和p和q之間的這個串的字尾匹配的該串的所有字首所代表的單詞也會被統計出來

(沒辦法,真的很拗口)

(優化的話很簡單,只要呼叫過的就設乙個bool型標記一下,下次就不用呼叫了)。如果失敗(設當前需要插入的字元為 cx,p指標在字典樹上對應的位置為triep,q在trie上所對應的位置為trieq),那麼p指標指向 triep 對於字元 cx 的 fail 指標指向的位置的字元在

主串上所對應的位置(不好意思這句話聽起來又很拗口,但只能這麼表達),同樣的trieq的位置也會改變,但是q的位置不變的,和前面一種情況相似,統計trieq在字典樹上所有和它字尾匹配的字首,處理方法和前面一樣。

這樣的話,對於任意的p和q可以統計出以p-q任意乙個位置為開始,以p-q中任意乙個位置為結尾的任何串是否在字典樹中匹配。如果插入成功,那麼p不變,q不斷的後移,同時不斷的呼叫out指標,滿足上述情況。如果插入失敗,呼叫trieq對於cx的fail指標,p移動到p』,這時說明串 p'-q是能與p-q的字尾匹配的最長字首,如果在p~~~p'中存在乙個位置px滿足以px為起始位置 存在乙個qx > q,滿足串px-qx在字典樹中匹配,那麼與串 p'-q是能與p-q的字尾匹配的最長字首矛盾!(想一想是為什麼)

所以,以某個位置px,(p <=px <= p')為開頭的所有的串已經被統計完。

這樣,p和q在ac自動機的呼叫中不斷地後移的過程中,對於px(px

然後,ac自動機的完善

大家都知道字典樹的每個節點裡有很多指標是用不到的吧,但是正好在ac自動機裡能用到,前面證明的時候我說呼叫triep 對於字元 cx 的 fail 指標,是的,如果插入失敗的話一定是那個指標沒有值,所以乾脆給他賦個值,代表失敗後的下乙個匹配的位置,而剛剛好沒有值的地方就是在這個位置所失敗的地方,所以這些指標我們全部都利用起來了,是吧~~~!!這也就是我覺得ac自動機完美的地方,把乙個有缺陷的字典樹變成乙個完美的ac自動機。完美的ac~~~~~

by  zhr2010

補碼正確性的證明

雖然不知道大牛怎麼想到這樣解決補碼的正負表示問題1,但這種解決辦法的正確性倒是可以嘗試證明一下。首先需要明確什麼叫正確性,充要條件暫時沒有想到,先列舉幾個必要條件,至少這些條件需要能成立 本身的值表示正確 本身的符號表示正確 運算結果的值表示正確 運算結果的符號表示正確 接下來證明每乙個條件 一定正...

krusal演算法正確性的證明

krusal演算法步驟如下 新建圖g,g中擁有原圖中相同的節點,但沒有邊 將原圖中所有的邊按權值從小到大排序 從權值最小的邊開始,如果這條邊連線的兩個節點於圖g中不在同乙個連通分量中,則新增這條邊到圖g中 重複3,直至圖g中所有的節點都在同乙個連通分量中 為什麼這一定是最小生成樹呢?關鍵還是步驟3中...

暖 墟 AC自動機 AC自動機的總結與運用

kmp 匹配單串,線性掃瞄,在失配時用next陣列引導j指標回溯,進行下一步匹配。trie樹 多模式的匹配,構造26叉樹,同時記錄多個串的情況,記錄結尾,進行匹配。kmp trie樹 ac自動機 ac自動機 給乙個字典,再給乙個文字,問這個文字裡出現了字典裡的哪些字。可以用n個單詞的n次kmp演算法...