1. AC自动机算法简介
AC自动机(Aho-Corasick Automaton)是一种高效的多模式字符串匹配算法,由Alfred V. Aho和Margaret J. Corasick于1975年提出。它能在单次扫描文本的同时,检测出所有预定义的模式串(比如敏感词),时间复杂度仅为O(n),与模式串的数量和长度无关。
这个算法特别适合构建敏感词过滤系统,因为它能同时处理成千上万个敏感词,而不会像传统方法那样随着词库增长而性能下降。举个例子,假设我们要过滤"赌博"、"毒品"等敏感词,AC自动机会把这些词构建成一个状态机,检查文本时就像用一把"梳子"快速梳理所有可能性。
2. 核心原理与数据结构
2.1 Trie树基础
AC自动机的核心是基于Trie树(字典树)构建的。Trie树是一种多叉树结构,每个节点代表一个字符,从根节点到某个节点的路径就构成一个字符串前缀。比如敏感词"java"和"python"会共享根节点到"p"节点的路径。
class TrieNode {
Map<Character, TrieNode> children = new HashMap<>();
boolean isEnd; // 标记是否为敏感词结尾
TrieNode fail; // 失败指针
}
2.2 失败指针机制
这是AC自动机的精髓所在。每个节点都有一个fail指针,当匹配失败时,不是从头开始,而是跳转到另一个节点继续匹配。这类似于KMP算法中的next数组,但是扩展到多模式匹配场景。
构建fail指针的过程采用BFS遍历:
- 根节点的fail指向自己
- 第一层节点fail指向根节点
- 其他节点的fail指向父节点fail指针对应字符的子节点
2.3 双数组优化
原始Trie树用Map存储子节点,虽然灵活但性能不够理想。双数组Trie(Doub

711

被折叠的 条评论
为什么被折叠?



