简介:
-
Aho-Corasick算法简称AC算法,通过将模式串预处理为确定有限状态自动机,扫描文本一遍就能结束。其复杂度为O(n),即与模式串的数量和长度无关。
思路
-
自动机按照文本字符顺序,接受字符,并发生状态转移。这些状态缓存了“按照字符转移成功(但不是模式串的结尾)”、“按照字符转移成功(是模式串的结尾)”、“按照字符转移失败”三种情况下的跳转与输出情况,因而降低了复杂度。
基本数据结构
AC算法中有三个核心函数,分别是:
-
success: 成功转移到另一个状态(也称goto表或success表)键: {当前状态, 输入} 值:下一状态
-
failure: 不可顺着字符串跳转的话,则跳转到一个特定的节点(也称failure表),我称为回溯状态, 从根节点到这个特定的节点的路径恰好是失败前的文本的一部分。
-
output: 命中的屏蔽词表
算法举例
以经典的ushers为例,假定4个词he/ she/ his /hers 为需要屏蔽的屏蔽词,输入文本为“ushers”。构建的自动机如图: