[Alg] 文本匹配-单模匹配与多模匹配

实际场景:

网站的用户发了一些帖子S1, S2,...,网站就要审核一下这些帖子里有没有敏感词。html

1. 若是网站想查一下帖子里有没有一个敏感词P,这个文本匹配要怎么作更快?算法

2. 若是网站想查一下帖子里有没有敏感词P1, P2,...,这个文本匹配要怎么作更快?优化

单模匹配与多模匹配

从以上的实际场景中,能够抽象出来两类文本匹配的问题。这里首先将"帖子"抽象为待匹配的序列S,将"敏感词"抽象为模式串P。那目标就是看看序列S中是否包含模式串P。网站

若是模式串P只有一个,要看看序列S中是否包含P,咱们称这是单模匹配问题;htm

若是模式串有多个P1, P2,...,要将序列S中出现的全部模式串所有找出来,咱们称这是多模匹配问题。blog

单模匹配经常使用算法-KMP

对于单模匹配问题,要如何作?get

暴力:若是分别从序列S和模式串P的第一个字符开始匹配,遇到不匹配的,则回到当前序列开始字符的下一个字符,和模式串的第一个字符来匹配,对于大规模文本很是不可行。io

因此提出了KMP算法进行优化。方法

多模匹配经常使用算法-字典树、AC、WM

对于多模匹配问题,经常使用的算法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]

相关文章
相关标签/搜索