AC多模式匹配算法

建議:
學習ac算法最好的途徑是看論文pdf_Efficient_String_Matching_An_Aid_to_Bibliohtml

1、通常的搜索算法

keyword: { he, she, his, her }
text: "ushers"
算法

  • 總結:
    如上圖所示,通常的搜索過程須要每一個關鍵字依次搜索,這是時間複雜度最高的算法。
    固然,能夠把每一個關鍵字搜索過程優化爲 KMP 或者 BM 算法,但仍然須要每一個關鍵字都搜索一遍。
    KMP、BM是單模匹配算法,使用多模匹配算法 AC 便可優雅解決此問題。

2、AC 算法的搜索過程

1.三個函數

  • goto 函數
    函數

  • fail 函數
    學習

  • output 函數
    優化

    省略了 output(state) = empty 的狀況3d

2.算法一 - 搜索過程

keyword: { he, she, his, her }
text: "ushers"
code

  • 總結:
    能夠看到使用 AC 算法的搜索過程僅遍歷了一次 text ,就找到了全部匹配 keyword。
    搜索過程從狀態0開始,經過 goto() 函數進行狀態轉換,每次轉換狀態都會執行 output() 函數,若是返回值不爲空,說明匹配到關鍵字。goto() 函數返回 fail 的狀況,執行 fail() 函數進行狀態轉換。

g(0,x) 沒有失敗的狀況,至少會跳轉到狀態0
fail(x) 也沒有失敗的狀況,至少會跳轉到狀態0
fail(x) 還存在優化的餘地,假設 keyword 中沒有 hers ,則此次 f(5) 就一次無用的跳轉。htm

算法一:
blog

3、生成 goto() fail() output() 函數的過程

1.算法二 - 生成 goto() 函數 和 不完整的 output() 函數

構造 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() 函數。

算法二

2.算法三 - 生成 fail() 函數 並補充 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) 就等於咱們找到的這個狀態值。

算法三:





附件列表

相關文章
相關標籤/搜索