AC自动机

生成自动机的话,简单自动机包括普通大小写字母,普通数字和*和.,其中,每一个普通字符都能移动到下一个节点,字符本身在线上,不在节点里,例如仅仅至是普通字符串的话,就是一长条节点序列。
成功的话就是能抵达最终节点,不成功的话就是在中间节点找不到下一个节点。
如果有点的话,则表明线上可以匹配任何字符。那么线上就是一个空条件。
如果是乘号+普通字符的话,它将线尾连接到了之前那个节点,那么就能接着使用之前那一条线的emmm,条件。
如果是点+乘号的话,是一样的。
有没有能分出多个线的,有,例如中括号的就可以分出多个。
但是解析模式本身也是需要状态机的吧?不需要,简单的if就好。

一个node节点,有编号,代表是否是截止节点,一个线的列表,
线本身也是一个结构体,条件+下一个节点指针。

关于如何命名,以及如何写代码,就需要看博客了

Trie树发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 以示区别,一般读「Trie」尾部会重读一声,可以理解为读「TreeE」。
假设有5个字符串,它们分别是:Code,Cook,Five,File,Fat。
在这里插入图片描述
很简单的。注意根节点没有字符。
AC自动机的工作原理就是将模式串构建成一个trie树(字典树),然后对目标串进行匹配。

给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。而不是说每个模式串匹配了多少次,如果一个点i的Fail指针指向j。那么root到j的字符串是root到i的字符串的一个后缀。
i:4 -> j:7
root到i的字符串是“ABC”
root到j的字符串是“BC”
“BC”是“ABC”的一个后缀
所以i的Fail指针指向j
就这么个意思。一般它是最长后缀,为什么呢?
首先我们可以确定,每一个点i的Fail指针指向的点的深度一定是比i小的。(Fail指的是后缀啊)

第一层的Fail一定指的是root。(比深度1还浅的只有root了)

就好像,一旦匹配失败了,那么换下一个就是具有相同前缀,只是比较小的,然后再不行,就更小的这样,那么,它会优先匹配前几个,完完全全是后缀的将会永远不会匹配到。有什么用呢?它能匹配到任何一个单词在任何位置。到节点末尾打印,可算是明白了。

var ac = new Trie();
createGoto(ac, [“she”, “shr”, “say”, “he”, “her”]);
createFail(ac);
console.log(match(ac, “one day she say her has eaten many shrimps”));
在这里插入图片描述
fail指针怎么来?首先呢,比的是有没有子节点,有子节点好说,没有子节点的话,换下一个节点,它们是同字符的,因为比较过了,然后有一个问题,就是hello,和ell两个单词的话,匹配hello,ell准匹配不到了
截断最长后缀概念,首先说,每个节点只有一个fail,根据本节点一直跳fail,直到有那个子节点为止,就是子节点的fail,在构建的时候,每个节点都有fail,每个节点都要跳一遍,这样才能所有fail节点建立。
每次遍历,不仅下面有进入下面的,而且fail有的话,也要进入fail的,这样才行。
是已探明前缀里的最长后缀。

假设当前节点为father,其孩子节点记为child。求child的Fail指针时,首先我们要找到其father的Fail指针所指向的节点,假如是t的话,我们就要看t的孩子中有没有和child节点所表示的字母相同的节点,如果有的话,这个节点就是child的fail指针,如果发现没有,则需要找father->fail->fail这个节点,然后重复上面过程,如果一直找都找不到(root的fail为null),则child的Fail指针就要指向root。

首先是构建出trie树来,然后push root,pop root,压入第一层,然后弹出第一个节点,设置fail,因为对自己的子节点设置它的fail指针,就这样。

结构就是这样的结构,你说弄清楚它的各个字符串的位置,比如说hello和ell,如果开头是e必然走e,但是开头是h的话就不行,是吧。必然走fail指针,明天编程,tmd。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值