zoukankan      html  css  js  c++  java
  • KMP算法笔记

    说实话,目前对于KMP算法还不是了解的特别通透

    但是为了先记住它,主要是因为现在没有那么多时间,所以先放在这里,等以后有空再重新编辑一下

    参考博客:

    https://blog.csdn.net/u012043391/article/details/52815909

    http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

    http://blog.csdn.net/guo_love_peng/article/details/6618170

    会转载其中一些图片,和内容

    首先KMP算法主要是用来减少初始字符串的匹配

    举一个很简单的例子

    在i=4与j=4时不匹配,传统做法是i回归原位,并右移一位重新开始下一轮的匹配

    可以看出,这种方法速度极慢

    那么KMP算法来了,其好处就是对于已经可以匹配的解直接跳过,也就是i不用回归原位,而j可以从不匹配的位置重新开始

    word is cheap ,show you the example

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    第一个是关于部分匹配值的计算

    首先这个东西还是很好理解的

    例如你现在要匹配的模式串为:

    而前缀就是:去除最后一个所有顺序子集

    例:123512

    前缀集有:1,12,123,1235,12351

    后缀就是:去除第一个所有的顺序子集

    23512,3512,512,12,2

    所有有公共的元素12,即长度为2

    例一个完整的部分匹配集数组:

    ababacacba

    p[1]=a ,显然没有前后缀,长度为0

    p[2]=ab,前缀为a,后缀为b,没有公共元素,长度为0

    p[3]=aba,前缀a,ab,后缀ba,a,公共元素a,长度为1

    p[4]=abab,前缀a,ab,aba,后缀bab,ab,公共元素ab长度为2

    p[5]=ababa,前缀a,ab,aba,abab,后缀baba,aba,ba,a公共元素aba长度3,(注这里还有一个a公共,但是根据定义为最长的)

    ........

    就可以获取一个表

    如果出现这种情况

    那么我们只需要将下面的匹配表移动=匹配的字符数-部分匹配值====》3-1(最后一个匹配字符为是3,所以为p[3]=1)=2,即向右移动两位

    虽然结果依旧是错的,但是看懂才是关键。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    如果使用KMP算法

     

    是不是一下省略了大量的计算,虽然目前结果依然不对,但是没关系。

    那么其核心就是如何找出next数组

    网上找next数组的方法特别多,但是其实比较正宗的就在上面的博客链接里

    然后也分为未改进的KMP算法和改进后的KMP算法

    首先是改进前的next数组

     未完待续。。。。。

  • 相关阅读:
    Nginx调优
    Nginx的压缩配置
    【进阶 6-1 期】JavaScript 高阶函数浅析
    个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能
    Java程序猿跳槽应该学哪些方面的技术!
    xamarin学习之路 例一、嵌入网页
    xamarin学习之路 一、vs2015 环境搭建
    xamarin 学习异常问题解决方法
    js 替换字符串 replace函数运用
    76Byte让你的JQuery更快
  • 原文地址:https://www.cnblogs.com/gambler/p/9236001.html
Copyright © 2011-2022 走看看