• AC自动机


      关于自动机,其实可以最简单的理解为,对于一个给定的初始状态,算法可以自动进行递归得出最终匹配或者不匹配两种情况。AC自动机试自动机的一种(Aho-Corasick automation),该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。所谓多模匹配,指的是同时匹配多个模式串,我们通常使用字符串匹配KMP算法其实是AC自动机的一种特殊情况,它只在一个时间内匹配一个模式串。了解这个关系之后,AC自动机的理解就相对容易了。

      具体操作:

      1,将所有待匹配的字符串构造一个Trie,作为AC自动机的搜索数据结构。例如,5个单词,say,she,shr,he,her。构造的Trie应该为(图片来源于网络)。           

      2,构造fail指针,使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。跟 KMP算法中的next相似, AC自动机在匹配时如果当前字符匹配失败,那么利用fail指针。

      3,构造好Trie和失败指针后,我们就可以对主串进行扫描了。这个过程和KMP算法很类似,但是也有一定的区别,主要是因为AC自动机处理的是多串模式,需要防止遗漏某个单词,所以引入temp指针。

      匹配过程分两种情况:(1)当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;(2)当前字符不匹配,则去当前节点失败指针所指向的字符继续匹配,如果最终指针指向root结束,说明没有匹配的字符串。重复这2个过程中的任意一个,直到模式串走到结尾为止。

       对照上图,看一下模式匹配这个详细的流程,假设主串为yasherhs,我们需要求模式串在主串中出现的次数。对于i=0,1。Trie中没有对应的路径,故不做任何操作;i=2,3,4时,指针p走到左下节点e。因为节点e的count信息为1,所以count+1,并且将节点e的count值设置为-1,表示改单词已经出现过了,防止重复计数,最后temp指向e节点的失败指针所指向的节点继续查找,以此类推,最后temp指向root,退出while循环,这个过程中count增加了2。表示找到了2个单词she和he。当i=5时,程序进入第5行,p指向其失败指针的节点,也就是右边那个e节点,随后在第6行指向r节点,r节点的count值为1,从而count+1,循环直到temp指向root为止。最后i=6,7时,找不到任何匹配,匹配过程结束。

  • 相关阅读:
    图片轮播插件比较(jquerySlide与superSlide)
    footer贴底的纯css实现方法
    input line-height 兼容解决方案
    HBuilder js 自定义代码块
    HBuilder HTML 自定义代码块
    HBuilder CSS 自定义代码块
    Element-ui el-cascader不触发prop?
    css水平垂直居中
    本地存储时注意的问题
    银行卡号,每四位添加空格
  • 原文地址:https://www.cnblogs.com/Xdwd/p/4211938.html
Copyright © 2020-2023  润新知