文档详情

AC自动机AC自动机.pdf

发布:2017-12-14约7.38千字共14页下载文档
文本预览下载声明
字符串精确匹配问题 • 问题描述:对于模式串集合P={p1,...,pk},在目标串T[m] 中找出现了哪 些模式串。 • 设n=|p1|+...+|pk| • 普通算法的时间复杂度是O(n+km) • AC 自动机算法是解决这种问题的一个经典方法,时间复杂度为 O(n+m+z),其中z是T 中出现的模式串的数量。 • AC 自动机是基于keyword tree的,并对其进行一些补充。 • KMP算法所解决的问题与这个类似,区别是KMP解决的问题是在目标 串T 中找一个模式串p出现的位置。其实两个算法的精髓也一样:当匹 配失败时可以最大程度的利用之前已匹配成功的串以避免重复匹配。 Keyword tree  keyword tree又叫“单词树”、“字典树”、“trie树” • 对于模式串集合P={p1…pk}的keyword tree是具有以下特性的有根树: 1. 每条边的值都是一个字符 2. 从一个点出发的任意两条边的值都不同 3. 结点v 的值被定义为L(v)={从根结点到结点v 的路径上的所有边的值的 序列} 4. 对任意模式串pi,都能找到一个结点v使得L(v)==pi 5. 对任意的叶子结点v ,都能找到一个pi使得L(v)==pi Keyword tree • A keyword tree for P={he,she,his,hers} h e r s i root s s h e keyword tree:构建 对于模式串集合P={p1…pk},构建keyword tree: 1. 从仅有的一个根结点开始 2. 依次插入模式串pi:从根结点出发,随着值为pi中当前字符的边一 直走下去, – 如果在pi中的字符结束之前,路径就终止了,那么为pi中剩余的所有字符创建新 的边和结点 – 在pi结束的时候,记录一下当前的结点为模式串pi的终止结点 • 构建的时间复杂度为O(|p1|+...+|pk|)=O(n) keyword tree:查找 • 在keyword tree中查找一个字符串p,也就是判断p是否出现在模 式串集合P中:从根结点出发,随着值为p中当前字符的边一直往下走。 – 如果在p结束时,当前的结点是一个被记录的终止结点,那么查找成功,p在模式 串集中 – 如果在p结束前,路径就终止了,则查找失败,p不在模式串集中。 • 查找时间复杂度为O(|p|)——一个高效的查找方法 • 一个普通的模式串匹配方法的时间复杂度将是O(nm),模式串的数量 为n,平均长度为m。 • 下面将把keyword tree扩展为一个自动机(Automaton),它可 以在线性的时间内进行匹配。 AC 自动机 (Aho-Corasick Automaton ) keyword tree的每个结点就是一个状态,根结点是初始状态(状态0) 自动机的行为被定义为一下3个函数: 1. goto函数g(q,a):返回从当前状态q走值为a的边后所到达的状态 – 如果从根结点出发没有值为a的边,那么g(0,a)=0,(就是说:当读入不匹配的 字符时,自动机保持在初始状态) – 如果从结点q出发有一条边值为a到达结点v,那么g(q,a)=v – 否则g(q,a)=Φ 2. fail函数f(q):返回从状态q(q!=0)匹配错误时要转移到的状态 – 如果L(v)是L(q)的一个后缀,且是最长的后缀,则f(q)=v,(就是说:一个错
显示全部
相似文档