前言
在数据结构课上,老师先讲了Finite State Automata,说理解了FSA然后理解KMP就不难了,然而FSA一直没能讲明白怎么构造FSA来实现字符串匹配。而今天看了Analysis Of Algorithm之后才发现虽然KMP算法确实是相当于简化的FSA,但是用FSA来查找子串简直是杀鸡用牛刀(比如说FSA可以用来判断母串里是不是有偶数个a并且有奇数个b,etc…但是KMP就不行了)。
如果不明白FSA,推荐看这个博客以及上面提到的Analysis Of Algorithm.
如果不明白KMP,推荐看这个博客,写得非常好。
基本的FSA概念
在说KMP与FSA的关系之前,一些FSA里面的概念要了解一下。
- 字符集∑ ,比如说∑={a,b,c}说明主串和子串中只含有a,b,c三个字母
- 状态的有限集合Q, 用于字符串匹配时就是Q={1…m},m是子串长度,状态1是初始态
当然算法导论里还有更多的相关概念,但是关于KMP的FSA用这两个就够了。
FSA里字符集∑的元素构成状态表的列,Q的元素(即每个状态)构成状态表的行。所以如果∑的大小为n, Q的大小是m,则表的大小是n*m,如果没有优化,中文的FSA状态表可以有20k列(所以说是杀鸡用牛刀)