1. 单模式串匹配
    BF 算法和 RK 算法
    BM 算法和 KMP 算法
  2. 多模式串匹配算法
    Trie 树和 AC 自动机

AC 自动机

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

AC 自动机的构建

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

public void buildFailurePointer() {Queue<AcNode> queue = new LinkedList<>();root.fail = null;queue.add(root);while (!queue.isEmpty()) {AcNode p = queue.remove();for (int i = 0; i < 26; ++i) {AcNode pc = p.children[i];if (pc == null) continue;if (p == root) {pc.fail = root;} else {AcNode q = p.fail;while (q != null) {AcNode qc = q.children[pc.data - 'a'];if (qc != null) {pc.fail = qc;break;}q = q.fail;}if (q == null) {pc.fail = root;}}queue.add(pc);}}
}

AC 自动机的匹配


public void match(char[] text) { // text是主串int n = text.length;AcNode p = root;for (int i = 0; i < n; ++i) {int idx = text[i] - 'a';while (p.children[idx] == null && p != root) {p = p.fail; // 失败指针发挥作用的地方}p = p.children[idx];if (p == null) p = root; // 如果没有匹配的,从root开始重新匹配AcNode tmp = p;while (tmp != root) { // 打印出可以匹配的模式串if (tmp.isEndingChar == true) {int pos = i-tmp.length+1;System.out.println("匹配起始下标" + pos + "; 长度" + tmp.length);}tmp = tmp.fail;}}
}

时间复杂度

AC 自动机算法包含两个部分,第一部分是将多个模式串构建成 AC 自动机,第二部分是在 AC 自动机中匹配主串。第一部分又分为两个小的步骤,一个是将模式串构建成 Trie 树,另一个是在 Trie 树上构建失败指针。
将多个模式串构建成 AC 自动机
Trie 树构建的时间复杂度是 O(mlen),其中 len 表示敏感词的平均长度,m 表示敏感词的个数。
每个节点构建失败指针的时间复杂度是 O(len)。整个失败指针的构建过程就是 O(k
len)。
AC 自动机做匹配
for 循环依次遍历主串中的每个字符,for 循环内部最耗时的部分也是 while 循环,而这一部分的时间复杂度也是 O(len),所以总的匹配的时间复杂度就是 O(n*len)。
实际情况下,可能近似于 O(n),所以 AC 自动机做敏感词过滤,性能非常高。

【数据结构与算法】字符串匹配 AC自动机相关推荐

  1. 数据结构与算法 / 字符串匹配 / BF、PK 算法

    零.前言 为了下面便于说明,先定义两个名词,分别是主串和模式串.在字符串 A 中查找字符串 B,则 A 为主串,B 为模式串. 假设,主串中字符数量为 L1,模式串的字符数量为 L2 . 一.BF 算 ...

  2. 数据结构与算法 / 字符串匹配 / Trie 树

    一.诞生原因 传统字符串比较时,需要将待比较的字符串与字符串集合中每一个串进行比较,结果比较浪费时间. Trie 树的发明就是为了解决上述问题. 二.基本信息 又称字典树,是一种树形结构,是一种哈希树 ...

  3. 头歌-数据结构与算法-字符串匹配

    第1关:实现朴素的字符串匹配 #include <stdio.h> #include <stdlib.h> #include "mystr.h" #prag ...

  4. 算法学习:AC自动机

    [定义] [自动机]  由 状态集 ,初始状态集 ,终止状态集 ,字母集 ,对应关系五个元素组成的结构   可以简单的将状态集理解为结点,初始状态集理解为初始点,终止状态集理解为终点 字母集理解为一个 ...

  5. 算法讲解:ac自动机及简单衍生

    AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段 ...

  6. C++KMP算法字符串匹配(附完整源码)

    C++KMP算法字符串匹配 C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) C++KMP算法字符串匹配完整源码(定义,实现,main函数测试) #include <iostr ...

  7. kmp算法字符串匹配C语言实现

    kmp算法字符串匹配 在leetcode做题时,有道题就是写一个strstr函数,先用思路最简单的直接两个循环做,提示时间超过限制.就查了查kmp的资料 翻了下算法导论,感觉像在看数学书,看不太懂,最 ...

  8. KMP算法-字符串匹配(浅显易懂)

    KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配. 本篇将以如下顺序来讲解KMP, 什么是KMP KMP有什么用 什么是前缀表 为什么一 ...

  9. [JAVA][算法] [字符串匹配]KMP

    我们为什么需要KMP? 在字符串匹配问题中,我们需要找到匹配串pattern在原串text中的位置,一种显而易见的思路就是暴力匹配,如图所示,我们把pattern放置到text中的每个位置进行比较即可 ...

最新文章

  1. SpringBoot 2.x 使用 JWT(JSON Web Token)
  2. [Java入门笔记] Java语言基础(四):流程控制
  3. python字典的遍历方法_遍历python字典几种方法
  4. c#泛型作为返回类型的写法
  5. 计算机高效课堂建设,打造职业学校计算机高效课堂.doc
  6. 多点在线构建Noxmobi全球化精准营销系统
  7. 基于CUDA的VTI介质有限差分正演模拟与逆时偏移及ADCIGs提取
  8. python柱状图代码_python+matplotlib实现礼盒柱状图实例代码
  9. 将Vim打造成Python快速开发环境(一)
  10. unity 切换场景
  11. 结构优化设计with OPtiStruct
  12. 个税计算公式excel_财务不会做工资表?全函数统计查询、自动个税计算模板送你,给力...
  13. 图片处理之thumbnailator和TwelveMonkeys的使用
  14. plsql的注册激活
  15. PVM振动测量2018~2020调研整理
  16. ArcGIS符号导入图片
  17. 软件行业的三类主要盈利模式
  18. 【笔试面试考点】PreparedStatement和Statement的区别与联系批量插入数据的优化
  19. MySQL DBA的修炼与未来
  20. springboot之Filter指定过滤URL的常见问题

热门文章

  1. CentOS6.8下安装memcached并设置开机自启动
  2. 【洛谷2986】【USACO10MAR】伟大的奶牛聚集
  3. LintCode 两两交换链表中的节点
  4. 内存数据库和关系数据库之间的数据同步原理
  5. Oracle9i OCM认证实践课考试的一些说明
  6. 三十岁前不要去在乎的18件事
  7. 中兴通讯 基于定位的技术和市场分析
  8. C# MVC的博客开发(二)登录
  9. lambda写法(多参数)
  10. .net多层结构 sql注入