收藏 分享(赏)

AC自动机.ppt

上传人:Facebook 文档编号:3138446 上传时间:2018-10-04 格式:PPT 页数:22 大小:145.50KB
下载 相关 举报
AC自动机.ppt_第1页
第1页 / 共22页
AC自动机.ppt_第2页
第2页 / 共22页
AC自动机.ppt_第3页
第3页 / 共22页
AC自动机.ppt_第4页
第4页 / 共22页
AC自动机.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、AC自动机,by 李翔,AC自动机,不是accept自动机。是Aho-Corasick 造出来的。所以你懂的,用途,字符串的匹配问题 多串的匹配问题例如给几个单词 acbs,asf,dsef, 再给出一个 很长的文章,acbsdfgeasf 问在这个文章中,总共出现了多少个单词,或者是单词出现的总次数。,实现的原理,形象的说:KMP+trie树(字典树)KMP,之前学过的。为什么用到了这个呢?因为也是一种没有多余回溯的算法。什么是trie树(字典树)?,Trie树,有神马特点,有一个空的根节点。对于一般的trie数是解决用英文字母组成文章。所以每个节点会有26个子节点(指针)。,构造的过程,开

2、始的时候有一个root,过程,要在该树中插入一个单词she,过程,再加一个单词shr。,过程,再插入say和her等,这样一个trie树就搞定了,如何与kmp联系在一起?,关键是在trie树上 加了一种fail指针。Fail指针的用途:就像是kmp中的next的数组。 在字符串失配的时候确定转移的节点。,先看到底是什么样的,这只显示了e的失配指针。 例如匹配文章:sher,构造fail指针的原理,根据父亲节点的fail指针来构造子节点的fail指针。动态的过程:下面是拷贝人家的ppt!编号为0的节点可以忽略之。,如何高效的构造前缀指针,ROOT1号节点的前缀指针指向0号节点,接下来按照BFS顺

3、序构造每个节点的前缀指针,定义虚拟节点0号节点,0号节点的所有连出的字边都连向ROOT1号节点,2号节点: 父亲是1号节点,连接字符为A,查找父亲的前缀指针0号节点,是否有通过A连接的儿子。 有!于是2号节点的前缀指针指向1号节点,3号节点: 父亲是1号节点,连接字符为B,查找父亲的前缀指针0号节点,是否有通过B连接的儿子。 有!于是3号节点的前缀指针指向1号节点,4号节点: 父亲是2号节点,连接字符为B,查找父亲的前缀指针1号节点,是否有通过B连接的儿子。 有!于是4号节点的前缀指针指向3号节点,5号节点: 父亲是3号节点,连接字符为A,查找父亲的前缀指针1号节点,是否有通过A连接的儿子。

4、有!于是5号节点的前缀指针指向2号节点,8号节点: 父亲是7号节点,连接字符为B,查找父亲的前缀指针5号节点,是否有通过B连接的儿子。 没有,继续查找5号节点的前缀指针2号节点是否有通过B连接的儿子。 有!于是8号节点的前缀指针指向4号节点,7号节点: 父亲是4号节点,连接字符为A,查找父亲的前缀指针3号节点,是否有通过A连接的儿子。 有!于是7号节点的前缀指针指向5号节点,6号节点: 父亲是3号节点,连接字符为B,查找父亲的前缀指针1号节点,是否有通过B连接的儿子。 有!于是6号节点的前缀指针指向3号节点,至此,这棵树的前缀指针我们就设计完成了!,对于一个插入了n个模式串的单词前缀树构造其前

5、缀指针的时间复杂度为:O(len(i),如何解决开始给的问题,在所有的绿色节点上做上标记。一旦访问到这个节点,就记录下。这样就能解决上面的问题。,hdu2222,5 /单词数 she /单词 he say shr her Yasherhs/文章,问有多少单词在文章中出现,代码实现,struct node int next26;int fail;int count;void init()memset(next, -1, sizeof(next);fail = 0;count = 0; s500005;,在树中插入单词,void ins() int len = strlen(str);int i,

6、 j, ind;for(i = ind = 0; i len; i+)j = stri - a;if(sind.nextj = -1)ssind.init();sind.nextj = sind+;ind = sind.nextj;sind.count+; ,在这里的操作对于不同的题目一般有3种不同的操作。 1:sind.count+; 这个是在解决出现总次数的时候是这样处理的。 2:sind,count=1; 这个是在ac自动机上进行dp的时候经常用的。 3.新加一个标记id。 这个是在处理有哪些单词出现过。,void make_fail() qin = qout = 0;int i, ind, ind_f;for(i = 0; i 0 /子节点的fail根据父节点fail指针的搞定 ,int fd() int ct = 0;int di, i, ind, p;int len = strlen(des);/这个是文章for(di = ind = 0; di 0 ,拓展,在自动机上进行dp要大家自己去理解,题目,Poj 12044052(题目在4044上下载) Hdu 2222 3065,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报