建議:
學習ac算法最好的途徑是看論文pdf_Efficient_String_Matching_An_Aid_to_Biblio
html
keyword: { he, she, his, her }
text: "ushers"
算法
goto 函數
函數
fail 函數
學習
output 函數
優化
省略了 output(state) = empty 的狀況3d
keyword: { he, she, his, her }
text: "ushers"
code
g(0,x) 沒有失敗的狀況,至少會跳轉到狀態0
fail(x) 也沒有失敗的狀況,至少會跳轉到狀態0
fail(x) 還存在優化的餘地,假設 keyword 中沒有 hers ,則此次 f(5) 就一次無用的跳轉。htm
算法一:
blog
構造 goto() 函數的過程就是生成 goto() 前綴樹的過程。從僅有一個點(狀態爲0)的前綴樹開始,逐個添加關鍵字到前綴樹便可。ci
1.添加 "he" 關鍵字
2.添加 "she" 關鍵字
]
3.添加 "his" 關鍵字
4.添加 "hers" 關鍵字
5.起點(狀態0)做特殊處理,使 g(0, x) 永遠不會返回 fail,x表示任意字符。
總結:
output() 函數目前還不完整,好比 output(5) 應該爲 {she, he } 才能完整匹配全部關鍵字。因此還須要另一個算法完成 output() 函數。
算法二
注:
爲表述方便,此處虛擬了 state() 函數。
例如:state("he")表示字符串"he"在goto() 前綴樹中所表示的狀態值,並不是真實存在的函數。
長度爲1的字符串,其 fail() 返回值確定是0。
狀況1:2個字符串的 fail() 返回值
狀況2:3個字符串的 fail() 返回值
狀況3:4個字符串的 fail() 返回值
狀況4:4個字符串的 fail() 返回值。
這裏與狀況3有一點區別,字符串 "ashe" 的最長子串 "she" 並非關鍵字,因此咱們認爲 "he" 是 "ashe" 的最長子串,因此字符串 "ashe" 的 fail() 返回值是 "he" 的狀態值。
總結:
以上4種狀況,間接表示了 fail() 函數生成過程,尤爲是僞代碼中 while g(staet, a) = fail do state <- f(state)
的含義,即找到一個字符串的狀態值,此字符串是當前關鍵詞的最長後綴,同時又是其餘關鍵詞的前綴。而後 fail(s) 就等於咱們找到的這個狀態值。
算法三: