字符串匹配自动机的算法原理
来源:互联网 发布:java变量的命名规则 编辑:程序博客网 时间:2024/05/23 14:16
上一节,我们知道,如何构造一个有限状态机,用于字符串匹配,我们只给出了怎么做,这一节,我们详细说明一下,为什么要这么做,我们要从数学上验证上一节我们给出的算法逻辑是经得起考验的。
如上图所示,有限状态自动机有以下几个特点:
1. 它由一系列的状态节点组成,我们用Q来表示这些节点的集合
2. 状态机一开始就会处于初始状态,我们用
3. 所以状态中,必有一个状态A
4. 组成字符串的字符集
5. 当状态机处于某个状态,接收到一个输入字符时,会跳转到另一个状态,这种跳转我们用一个函数
我们再引入一个函数
状态机一开始时,处于初始状态,也就是状态机什么都不接收时或接收空字符串时就处于初始状态,于是我们有:
假设w 是一个字符串,那么有:
上面这个公式需要好好解释一下,假定w=”aabb”, wa = “aabb” + ‘a’ = “aabba”.
当状态机接收字符串”aabb”后,处于状态0,于是就有
数学推理是一个比较烧脑的过程,想必上面的解释会让不少同学抓耳挠腮一阵子。
假设要查找的字符串,我们用P来表示,对于给定一个文本T, 如果P 的前k个字符所组成的字符串是T的后缀的话,我们就定义:
例如 P=”abcdefg”, T = “hhhhhhhha”, 那么P的前1个字符所组成的字符串”a”是T的后缀,所以
T=”hhhhhhab”, 那么P的前两个字符组成的字符串”ab”构成T的后缀,于是
T=”hhhhhabc”, P的前3个字符组成的字符串”abc”构成T的后缀,于是有
依次类推。
上一节我们构造的状态机是满足以下条件的:
1. 如果P 含有m个字符,那么状态机就有m+1个状态节点,他们分别为{0,1,2…m}, 并且初始状态
2. 当状态机处于状态q时,如果接收字符a, 那么状态机要跳转的下一个状态是:
上一节我们给出的代码有这么一段:
private void makeJumpTable() { int m = P.length(); for (int q = 0; q <= m; q++) { for (int k = 0; k < alphaSize; k++) { char c = (char)('a' + k); String Pq = P.substring(0, q) + c; int nextState = findSuffix(Pq); System.out.println("from state " + q + " receive input char " + c + " jump to state " + nextState); HashMap<Character, Integer> map = jumpTable.get(q); if (map == null) { map = new HashMap<Character, Integer>(); } map.put(c, nextState); jumpTable.put(q, map); } }
String Pq = P.substring(0, q) + c; 这一句代码的作用,其实就是构造字符串
如果我们能够证明,我们前一节构造的状态机满足:
定理1:
对给定的匹配字符串P, 以及文本x, 还有任意字符a, 我们有:
令r =
由于
定理2:
对匹配字符串P, 文本字符串x, 以及任意一个字符a, 如果 q =
先看个具体实例,P=”bacdb”, x=”ffffb”, 1 = q =
xa = “ffffba”, 于是2 = q =
如果
于此同时
综合两个不等式,我们有
定理3:
给定匹配文本P, 以及要查找的文本T[1…n],那么对i=0, 1, 2…n 有:
也就是说,我们把字符串T[1..i]输入到自动机后,最终的状态编号k相当于匹配字符串P[1…k] 是字符串T[1..i]的后缀,如果k = m, 那么P就是T[1..i]的后缀,从而能P就包含在文本T中。
证明:
我们在i上用数学归纳法,当i=0时,结论显然成立,假设当i=k时也成立,那么有:
接下来我们需要证明等式
令 q =
=
于是我们便证明了,上一节我们所构造的状态机用于匹配字符串是正确的。
- 字符串匹配自动机的算法原理
- 字符串匹配的FA(有限状态自动机)算法
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- KMP字符串匹配算法(一)—模式字符串的匹配有限自动机
- 字符串匹配之有限自动机&kmp算法
- 【算法】利用有限自动机进行字符串匹配
- 字符串匹配算法之:有限状态自动机
- 多模字符串匹配算法之AC自动机—原理与实现
- 多模字符串匹配算法之AC自动机—原理与实现
- 多模字符串匹配算法之AC自动机—原理与实现
- 字符串匹配算法——利用有限自动机进行匹配
- 算法导论 第32章 详解字符串的匹配,自动机,KMP算法
- 字符串匹配算法原理简述
- 字符串匹配kmp算法原理
- 字符串匹配算法SMA 总结之四:自动机算法
- 算法——字符串匹配之有限自动机算法
- Java实现算法导论中有限自动机字符串匹配算法
- Medium 33题 Search in Rotated Sorted Array
- js数组
- 华为oj之最小公倍数
- 【腾讯TMQ】运用AOP思想更优雅地进行性能调优
- Shell脚本学习心得[持续更新]
- 字符串匹配自动机的算法原理
- Java数组
- Tmux知识总结
- Long short-term memory 论文小记
- springmvc与swagger的集成
- rz命令与sx等命令——串口终端下载文件到目标板
- MAC安装配置tomcat
- [从头学数学] 第283节 [计算几何] 多边形的单调块划分
- 车道线检测霍夫直线检测原理分析