数据结构定义和算法--AC自动机

定义

AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 next 数组,只不过此处的 next 数组是构建在树上罢了。

构建AC 自动机包含两个操作:

  1. 将多个模式串构建成 Trie 树;
  2. 在 Trie 树上构建失败指针(相当于 KMP 中的失效函数 next 数组)。

下面链接讲得更加清晰:

https://www.bilibili.com/medialist/play/ml1213813670/BV1uJ411Y7Eg

 

复杂度分析

构建Trie树

Trie 树构建的时间复杂度是 O(m*len),其中 len 表示敏感词的平均长度,m 表示敏感词的个数。

 构建失败指针

假设 Trie 树中总的节点个数是 k,每个节点构建失败指针的时候,每个节点构建失败指针的时间复杂度是 O(len)。整个失败指针的构建过程就是 O(k*len)。AC 自动机的构建过程都是预先处理好的,构建好之后,并不会频繁地更新,不会影响到敏感词过滤的运行效率。

AC 自动机匹配

for 循环依次遍历主串中的每个字符,for 循环内部的时间复杂度也是 O(len),所以总的匹配的时间复杂度就是 O(n*len)。因为敏感词并不会很长,而且这个时间复杂度只是一个非常宽泛的上限,实际情况下,可能近似于 O(n)。失效指针可能大部分情况下都指向 root 节点,所以绝大部分情况下,在 AC 自动机上做匹配的效率要远高于刚刚计算出的比较宽泛的时间复杂度。只有在极端情况下,AC 自动机的性能才会退化的跟 Trie 树一样。

 

《数据结构与算法之美》 -- 王争

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值