AC自动机

应用背景

在互联网应用中,通常会用到关键词检测功能,以防止用户发表包括了指定关键词的内容。如游戏的聊天系统、角色名称检测,论坛发帖、直播弹幕等,都需要对用户发布的内容进行检测,以检测是否包含敏感的关键字。

通常需要检测的关键词,会有很多很多,比如侮辱人的关键词,政治敏感的关键词,系统相关的特定关键词等。毫不夸张的说,通常要检测的关键词会有几千个,甚至过万。这时效率都变得尤为突出,如果检测关键词的效率低下,对大型互联网应用来说,很可能有是致命的。

以8000个关键词为例,如果使用正则表达式,则需要对用户发布的内容遍历8000遍。如果同一秒中,有100位,1000位,10000位…用户发布内容,可想而知仅仅在关键词检测方面服务器上CPU的开销。

AC多模式匹配算法,可以有效的解决关键词检测的效率问题。时间复杂度为O(n),n为用户发布内容的长度n。基本与关键词的数量无关。

AC算法介绍

AC算法是一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,…pm},在O(n)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关。

AC算法实现原理:
ac自动机,就是在tire树的基础上,增加一个fail指针,如果当前点匹配失败,则将指针转移到fail指针指向的地方,这样就不用回溯,而可以路匹配下去了

举例:
如要查找abce和bcd是否在abcd中出现,我们找到c发现下一个要找的不是e,就跳到bcd中的c处,看看此处的下一个字符(d)是不是应该找的那一个
因为abc部分的后缀与bcd的部分前缀相同,便能构造fail指针

在这里插入图片描述

完整流程:

  • 构建敏感词树型结构,并标注结束节点(即是否是一个敏感词的结束);
  • 为树上的结点,构建匹配失败时的跳转-失败结点(即匹配失败时,跳转到哪个结点继续匹配);
  • 对用户内容进行一次遍历,对于每个字符(字节)都去敏感词树型结构中,从当前结点位置开始匹配。

构建过程

以模式串he,she,him,hers,shit为例,先构造一颗字典树

在这里插入图片描述

图像说明

  • 图中根节点为空节点
  • 红色节点表示该节点是一个存在的字符串
  • 蓝色实线连接父子节点
  • 黄色虚线表示fail指针
  • 没有标注黄色虚线的节点,fail指针默认都指向根节点

fail指针构造过程

  • 第三行的h节点,找到父节点的fail节点的子节点中,与当前节点相同的点,将h的fail指针指向该节点
  • 第四行的i节点,找他i节点的父节点的fail节点的子节点中是否有i节点
  • 依次类推

匹配示例

拿主串ashers上去匹配

在这里插入图片描述

  • 第三步确定找到she,接续沿着线头则匹配失败,根据fail指针跳转
  • 第四步找到he,继续往下找
  • 第六步找到hers,匹配结束
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值