實際場景:
網站的用戶發了一些帖子S1, S2,...,網站就要審核一下這些帖子里有沒有敏感詞。
1. 如果網站想查一下帖子里有沒有一個敏感詞P,這個文本匹配要怎么做更快?
2. 如果網站想查一下帖子里有沒有敏感詞P1, P2,...,這個文本匹配要怎么做更快?
單模匹配與多模匹配
從以上的實際場景中,可以抽象出來兩類文本匹配的問題。這里首先將"帖子"抽象為待匹配的序列S,將"敏感詞"抽象為模式串P。那目標就是看看序列S中是否包含模式串P。
如果模式串P只有一個,要看看序列S中是否包含P,我們稱這是單模匹配問題;
如果模式串有多個P1, P2,...,要將序列S中出現的所有模式串全部找出來,我們稱這是多模匹配問題。
單模匹配常用算法-KMP、BM、Sunday
效率:KMP < BM < Sunday
對於單模匹配問題,要如何做?
暴力:如果分別從序列S和模式串P的第一個字符開始匹配,遇到不匹配的,則回到當前序列開始字符的下一個字符,和模式串的第一個字符來匹配,對於大規模文本非常不可行。
所以提出了KMP、BM、Sunday等算法進行優化。
多模匹配常用算法-字典樹、AC、WM
對於多模匹配問題,常用的算法
1. 構建字典樹。
2. AC算法。對於1中最簡單的字典樹,遇到不匹配的,又重新回根節點再次判斷,並不能充分利用模式串的信息。可以參考KMP尋找next的方法,為字典樹的節點找fail時跳轉的節點,加速。
3. WM算法。
算法詳解
<1> 單模匹配
1. KMP: https://www.cnblogs.com/shiyublog/p/12494790.html
2. BM: https://www.cnblogs.com/zhangtianq/p/5839909.html
3. Sunday: https://www.cnblogs.com/shiyublog/p/12601886.html
<2> 多模匹配
1. AC: https://www.cnblogs.com/shiyublog/p/12494120.html
2. WM: https://www.cnblogs.com/shiyublog/p/12616964.html