有限状态自动机(字符串匹配)

一、有限自动机

有限状态机是一个处理信息的简单机器。通过对文本字符串 T 进行扫描,找出模式 P 的所有出现位置。给它输入一个模式串,会得到一个YES或者NO的结果。
它只对每个文本字符检查一次,并且检查每个文本字符时所需的时间为常数。因此,在模式预处理完成并建立好自动机后进行匹配所需要的时间为 O(n) 。

二、实现

一个有限自动机 M 是一个 5 元组(Q,q, A, ∑,δ)

Q 是状态的有限集合
q∈Q 是一个初始状态
A 包含于 Q 是一个特殊的接受状态集合
∑ 是有限输入字母表
δ 是一个从 Q✖∑ 到 Q 的函数,称为 M 的转移函数

例如,对于0101111001串构建一个判断1的个数是否为偶数个的有限自动机

最后结果为红色区域,表明这个是一个偶数。

又例如,对P="ababaca"构建有限自动机,如以下a图所示

对于每一状态,会根据接受字符的情况来变化。

如b图所示,左边坐标表示状态;右边表示模式串P的匹配情况;上方表示输入情况。
例如第一行:当状态为0时,此时匹配的是P串的字符a。当输入为a时,转入状态1;输入为b,c时,转入状态0.

如c图所示:表示的是文本串T的匹配情况。在文本串之下的是状态的情况,当状态为7时,匹配成功。

伪代码

创建转移函数伪代码

P:模式串(要找到的串)
∑:有限的字母表(对于一个串,我们应该知道其出现了多少种字母,如aabcc的字母表为a、b、c)
k:根据状态q和输入的字符的不同,所设置的该转移到的状态

双层for在做的事:对于每一个状态q,又对于每一个字母表中的字符,k为最可能的最大状态(要么是当前状态q+2,要么是长度m加1,注意这里多了1),然后k自减,直到Pk是Pq合上字符a的后缀时,设置状态函数状态。(参考KMP找最长公共前后缀)

有限自动状态机实现代码

简单来说,就是对于文本串的每一个字符,不断更新当前状态q,当q为模式串长度m时,说明找到串了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容