網站的用戶發了一些帖子S1, S2,...,網站就要審覈一下這些帖子裏有沒有敏感詞。html
1. 若是網站想查一下帖子裏有沒有一個敏感詞P,這個文本匹配要怎麼作更快?算法
2. 若是網站想查一下帖子裏有沒有敏感詞P1, P2,...,這個文本匹配要怎麼作更快?優化
從以上的實際場景中,能夠抽象出來兩類文本匹配的問題。這裏首先將"帖子"抽象爲待匹配的序列S,將"敏感詞"抽象爲模式串P。那目標就是看看序列S中是否包含模式串P。網站
若是模式串P只有一個,要看看序列S中是否包含P,咱們稱這是單模匹配問題;htm
若是模式串有多個P1, P2,...,要將序列S中出現的全部模式串所有找出來,咱們稱這是多模匹配問題。blog
對於單模匹配問題,要如何作?get
暴力:若是分別從序列S和模式串P的第一個字符開始匹配,遇到不匹配的,則回到當前序列開始字符的下一個字符,和模式串的第一個字符來匹配,對於大規模文本很是不可行。io
因此提出了KMP算法進行優化。方法
對於多模匹配問題,經常使用的算法next
1. 構建字典樹。
2. AC算法。對於1中最簡單的字典樹,遇到不匹配的,又從新回根節點再次判斷,並不能充分利用模式串的信息。能夠參考KMP尋找next的方法,爲字典樹的節點找fail時跳轉的節點,加速。
3. WM算法。
1. KMP: http://www.javashuo.com/article/p-qlbezaaf-km.html
2. AC: http://www.javashuo.com/article/p-qqdvzjnp-ka.html
3. WM: [placeholder]