实际场景:
网站的用户发了一些帖子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