字符串匹配的基本解决方案,是在长串中从头至尾遍历匹配模式串,直到找到完全匹配的位置,这样做一个最大的问题就是每次都重头开始匹配,完全没有用到已经匹配过的结果,非常的浪费,于是自动有限机和KMP就是基于这种利用已经匹配到的结果,在不匹配的位置出现时,立即查找下一个有效位置的算法。

在列出有限自动机的定义之前,想先讲讲这个算法的思想。所谓有限自动机机,我理解就是一张状态转移表,表头包括有限的模式串字符集与可能产生的状态。模式串字符集很好理解,例如要查找的模式串为aaba,那字符集就是{a, b};可能产生的状态也很好理解,也用aaba举例,可能产生的匹配结果无非是,a, ab, aab, aaba, 那状态也就是0,1,2,3,4,表示的是当前匹配成功多少位了,只有当状态达到4的时候,才表示完全匹配到了。

字符串匹配的有限自动机的关键,就在于构建这个状态转移表。

下面给出《算法导论》里自动有限机的定义:

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

Q是状态的有限集合

q0∈Q 是Q的初始状态

A 是Q的子集,是一个特殊的接受状态集合

∑ 是有限输入字母表

δ是一个从Q×∑到Q的函数,成为M的转移函数

有点抽象,但是对应到字符串匹配的问题里看看,就一目了然了,下面将用于匹配的模式串用P表示。

Q:就是此前提到的字符串可能匹配到的数目,从0到P.length;q0肯定是0呀;A很显然在完全匹配的情况下只能是P.length;∑ 就是前文所说的P的字符集,而重中之重的转移函数δ,就是接下来要详细解析一下的东西了。

状态转移函数其实也很好理解,以aaba为例。假设当前aaba与被匹配的字符串已经匹配到了aa两个字符,那么当前的状态就是2,在状态2的前提下,去查看下一个字符,如果下一个字符是b那么状态很自然就转移成了2+b= 2+1=3,如果下一个字符是a,a和b不相等了,那此时的状态是几呢?是0吗?需要重新开始匹配吗?显然不是呀,因为aaa 和 aaba明显 还是可以成功匹配aa的呀,所以状态2+a的结果仍旧是2,这个值的求解过程简单说来就是每当遇到一个不匹配的位置时,查看此前已经匹配成功的结果后缀与P的前缀最长的公共部分,例如aab的前缀与aaa的后缀能匹配到的最大长度就是2(这一部分算法导论里给了非常详细的证明,因为公式实在不好敲,加上论证也比较绕口,就不贴了哈,这个思想其实就是KMP算法的基础,下一篇文章会再分析)。这就是状态转移表的一行,现在我试着把整个状态转移表画出来。

| 状态 | a | b|

| -- |:-----:|

| 0 | 1 | 0|

| 1 | 2 | 1|

| 2 | 2 | 3|

|3| 4| 0|

|4| 2| 1|

要求出状态4与字符集的转移关系其实是为了查找下一个匹配位置的。而状态值,我啰嗦一下,就是表示当前能够匹配成功字符串长度,例如状态3+b=0,表示aabb的后缀( abb ,bb, b ) 都没有办法和aab进行匹配,我们就可以跳过abb和P的比较,直接进行到b之后的下一个字符了,这就是算法利用已知结果免去重复计算的方法。我们通过在状态表中根据当前状态+下一个字符输入查询得到新的状态,然后比较新的状态是否就是可接受状态P.length 来判断是否匹配成功,从而最终完成字符串的匹配。这就是自动有限机用在字符串匹配里的计算过程。

下面我贴一下求解状态转移表的伪代码

compute-transition-function(P, ∑)

m = P.length

for q = 0 to m

for each character a in ∑

k = min(m+1, q+2)

repeat

k = k -1

until P[0..k] == P[q-k..q]a

δ(q, a) = k

return δ

java自动机字符串匹配_字符串匹配之有限自动机相关推荐

  1. python字节流和字符流_字符流与字节流

    [一]写在前面 简单总结一下分别用(一直混淆的)字节流or字符流读写文件. [二]字节流 2.1 字节流介绍 程序中的输入输出都是以流的形式保存的(输入流or输出流),流中保存的实际上全都是字节(一个 ...

  2. java字符序列_字符序列(CharSequence)

    字符序列(CharSequence) 1.相关接口 java.lang.CharSequence 接口 java.lang.Appendable接口 java.lang.Comparable接口 ja ...

  3. 解决文件内容的中文乱码_字符集_字符编码_字符编码方案

    从第三方下载的java源文件,打开查看里面的中文全部是乱码,无论你使用什么字符编码集都无法正常显示,该文件是用UTF-8编码存档的,使用UTF-8解码也同样是乱码,相信很多人遇到类似的问题,我这里解决 ...

  4. java 蓝桥杯算法提高 字符串匹配(题解)

    试题 算法提高 字符串匹配 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时 ...

  5. cell数组变为字符串_字符串匹配 ---- BM 算法原理

    关于字符串匹配有很多算法, BF, BK, KMP, 但这些都不是这篇文章的重点. 文章的重点是另外一种更高效的算法 Boyer-Moore 算法, 一般文本编辑器中的查找功能都是基于它实现的. 前置 ...

  6. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  7. 复习Java字节流_字符流使用及案例

    字节流_字符流 主要内容 IO流 字节流 字符流 异常处理 Properties 第一章 IO概述 1.1 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了ctrl+s ,可能 ...

  8. java中0x0f对应的字符是什么_常见字符的ASCII码,java中如何获取字符的ASCII码

    一.常见字符的ASCII码 ASCII 码使用指定的7 位或8 位的二进制数组合来表示128 或256 种可能的字符. 标准ASCII 码也叫基础ASCII码,使用7 位二进制数(最高的1位二进制为0 ...

  9. java -IO流_字符流

    字符流 经过前面的学习,我们基本掌握的文件的读写操作,在操作过程中字节流可以操作所有数据,可是当我们操作的文件中有中文字符,并且需要对中文字符做出处理时怎么办呢? 字节流读取字符的问题 通过以下程序读 ...

  10. java byte char io流_吃透Java IO:字节流、字符流、缓冲流

    前言有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身, ...

最新文章

  1. 2.安装Ubuntu系统时,系统时间显示不对
  2. ICA--独立成分分析(Independent Component Analysis)
  3. JSP中一个页面怎么分清是链接过来还是提交过来的?
  4. Nginx实用指南V1 (连载之六:cacti监控)
  5. OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()
  6. 快速排序 java导包_排序算法-快速排序(Java实现)
  7. 数据仓库中的模型设计(转)
  8. 抓取经过无线路由器的数据_无线网关是什么 无线网关的作用
  9. spring 全局变量_Spring 十个错误的使用姿势!
  10. [转载] numpy.ma详解
  11. 任务四十七:王牌特工 准备工作(二)
  12. JxBrowser开启调试模式,JxBrowser debug
  13. c语言对英文字母循环加密,加密英语
  14. 风尚云网学习-Linux/宝塔面板部署禅道开源系统
  15. CCF CSP认证201509-1数列分段
  16. Esp8266学习搭建开发环境,开始一个“hellow world”串口打印。
  17. 第九篇:稳定性之面向失败设计【可用性架构设计、可用性容灾】
  18. 高中数学,向量高考真题解题技巧(快速口算)
  19. ICMP协议服务器怎么开启关闭ICMP协议?
  20. maven通过mvn命令添加oracle依赖

热门文章

  1. 适合普通大学生的前端开发学习路线
  2. OpenG绘图方式比较
  3. HIT 软件构造2019春 Lab3
  4. 微信小程序分享功能的实现
  5. python3中英文混合字符串的分离
  6. 华尔街持续唱多美股市场,微美全息发布VR设备领涨科技股
  7. 哈哈,没有什么能阻止得了这届父母要卷的决心
  8. SpringBoot整合oracle报错异常信息(java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid(I))
  9. JavaScript学习总结
  10. 八爪鱼-自定义模式采集数据_视频教程执行