转载请加上:http://www.cnblogs.com/courtier/p/4273193.html

  • 在开始讲这个文章前的唠叨话:

1:首先,在阅读此篇文章之前,你至少要了解过,什么是有限状态机,什么是KMP算法,因为,本文是从KMP的源头,有限状态

机来讲起的,因为,KMP就是DFA(Deterministic Finite Automaton)上简化的。

2:很多KMP的文章(有限自动机去解释的很少),写得在我看来不够好,你如果,没有良好的数学基础就很难去理解他们(比如下图),

因为,你能够理解KMP算法就已经可以入ACM新手的大门了,有很多人说一个算法就能进入ACM?来我们看看为什么叫KMP算法,很简单

这个是由三个数学家发明的,那么,我说一个算法要由三个数学家来推理,就可以说明这个分量的了。

3:有些人问,我能够举例出Next的方法来做这类题呀,我感觉太喽了,特别是计算机专业的,KMP算法还用数组慢慢移给别人看?

假设,你是面试官你是收慢慢移动的人呢?还是给出DFA的人呢?我们开始正题吧,废话有点多

( 算法导论 )

  • 我们要做的工作:

就是画出下图的有限自动机,

(帅吧,简直就是酷逼了,字符串能画成这么帅)

  • 我的方法(绝无仅有,自己通过推算摸索出来,但是,又不带数学公式的)

               1.首先,画好状态图,以上图为例,我们的输入 = {A,B,C}(因为,我们模式串只有ABC三位),构造出如下图:

2.根据上图,建立下面一张表:(就是0输入a到1等这类关系矩阵):

      1. 以0列来看,为什么是1?很简单,因为 0 输入 A 到 1,输入其他就是到0
      2. 在这里,我们得设一个X,这个X∈(0,T.len-1){其中T是字符串} 
      3. 这些固定的值就是下表的值,是不能被替换的,看了下面你就知道。
  0 1 2 3 4 5
  A B A B A C
A 1   3   5  
B   2   4    
C           6

3.在上面我们设置了一个X(这个是关键中的关键了)我们来看看怎么用?

1. 这两个X=0怎么来的呢?第一个,不用看,一定是0。第二个,我们就要看

  当前的列所代表的字母(就是列的第一个字母)跟前面的X的值所在的列中与当前字母相同的就

                                是X的值(比如,第1列的字母是B,前面一个的X是0,So,看第0列的”B ”是0),所以,第0

                                列的B的值赋值给当前列,即X=0

                            2. 再把前一个X所代表的列赋值给当前列。进入下一个。

Example 1

  X=0 X=0        
  0 1 2 3 4 5
  A B A B A C

A

1

1

3

 

5

 

B

0

2

 

4

 

 

C

0

0

 

 

 

6

Example 2

  X=0 X=0 X=1      
  0 1 2 3 4 5
  A B A B A C
A 1 1 3   5  
B 0 2 0 4    
C 0 0 0     6

4. 整张表如下:

  X=0 X=0 X=1 X=2 X=3 X=0
  0 1 2 3 4 5
  A B A B A C
A 1 1 3 1 5 1
B 0 2 0 4 0 4
C 0 0 0 0 0 6
                 5.画图:
  • 上面说了那么多,如果,你还不懂,还可以看我翻译的来自于Course的视频(英语不好勿怪)代码,请看我的GITHUB:

https://github.com/aliencool/Algorithm/tree/master/Searching

  • 结束语:

为什么很多人叫KMP算法叫”看毛片“算法,就因为是拼音?太LOW了这样子解释,为什么呢?因为,KMP他不回溯,每次,都是

模式串自己搞自己(你懂的),所以,才叫”看毛片“算法。

如果,你还有问题或者其他,请给我联系,请期待我下一篇可能是关于倒排索引或者基础理论的算法或者代码,谢谢,O(∩_∩)O!

从有限状态机的角度去理解Knuth-Morris-Pratt Algorithm(又叫KMP算法)的更多相关文章

  1. 我所理解的 KMP(Knuth–Morris–Pratt) 算法

    假设要在 haystack 中匹配 needle . 要理解 KMP 先需要理解两个概念 proper prefix 和 proper suffix,由于找到没有合适的翻译,暂时分别称真实前缀 和 真 ...

  2. 从逆向的角度去理解C++虚函数表

    很久没有写过文章了,自己一直是做C/C++开发的,我一直认为,作为一个C/C++程序员,如果能够好好学一下汇编和逆向分析,那么对于我们去理解C/C++将会有很大的帮助,因为程序中所有的奥秘都藏在汇编中 ...

  3. 从需求的角度去理解Linux系列:总线、设备和驱动

    笔者成为博客专家后整理以前原创的嵌入式Linux系列博文,现推出以让更多的读者受益. <从需求的角度去理解linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文 ...

  4. 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解

    一.前言   在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...

  5. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...

  6. Android AsyncTask完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...

  7. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  8. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  9. 从源码角度深入理解Toast

    Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这 ...

随机推荐

  1. Hive和HBase的区别

    一.两者分别是什么:     Apache Hive是一个构建在Hadoop基础设施之上的数据仓库.通过Hive可以使用HQL语言查询存放在HDFS上的数据.HQL是一种类SQL语言,这种语言最终被转 ...

  2. uvalive 4851 Restaurant(扫描法)

    题意:有一个M*M的网格,坐标[0...M-1,0...M-1] 网格里面有两个y坐标同样的宾馆A和B.以及n个餐厅,宾馆AB里面各有一个餐厅,编号1,2,其它餐厅编号3-n.如今你打算新开一家餐厅. ...

  3. VB.NET入门基础

    众所周知,Visual Basic.NET是由Visual Basic发展而来,这两者之间的升级使得Visual Basic语言发生了革命性的变革,使得由基于对象编程的Visual Basic过渡到了 ...

  4. Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子)

    Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子) 由其做动态编程时非常有用,必须符合js中的语法,用eval能够执行. var aaa="alert('这是变量中的语句')&q ...

  5. Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)

    解题报告 四种情况相应以下四组数据. 给两字符串,推断第一个字符串是怎么变到第二个字符串. automaton 去掉随意字符后成功转换 array 改变随意两字符后成功转换 再者是两个都有和两个都没有 ...

  6. Rational AppScan 扫描大型网站

    Rational AppScan 工作原理 Rational AppScan(简称 AppScan)其实是一个产品家族,包括众多的应用安全扫描产品,从开发阶段的源代码扫描的 AppScan sourc ...

  7. 阿里云OS和Android的关系(本文转载月光博客)

    原博客地址:http://www.williamlong.info/archives/3222.html 近日,有关谷歌Android和阿里云的争论闹得沸沸扬扬,谷歌高管.Android开发领头人An ...

  8. UltraEdit环境下,php简单环境配置

    1.语法高亮 菜单->视图->查看方式->选中“PHP” 2.自动补全 菜单->高级->配置->自动完成->选中“自动显示自动完成对话框”,字符数选择2-3为 ...

  9. git开源项目协作

    开源项目协作 fork开源项目,即打开开源项目的github,然后点击fork按钮 pull request

  10. Fiddler使用笔记

    http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html#basic   1.filter的使用,跟踪某个网站的访问,例如:hr. ...