KMP算法推导
来源:互联网 发布:智能软件开发 编辑:程序博客网 时间:2024/06/07 10:40
申明:此文系博主对Huge对KMP算法的推导过程的加工整理而成,在读此文之前,如果对KMP算法不是非常了解的,可以去到http://blog.csdn.net/eternity1118_/article/details/51604641阅读有关KMP的相关知识,如果已经非常了解,那就请继续吧。。
有了以上的资料了解后,让我们一起来推导和构建KMP算法吧。
定义:
A是问题中模式串(短串),长度为n;
B是问题中的文本串(长串),长度为m;
其中,A[i]代表A字符串的第i位
B[j]代表B字符串的第j位
A[i,j]代表A字符串的第i位到第j位(注:下标从1开始)
B[i,j]代表B字符串的第i位到第j位(注:下标从1开始)
Sign(i,j)为符号函数,取值为0和1:
A[i] = B[j],Sign(i,j) = 1;
A[i] != B[j],Sign(i,j) = 0;
重点问题1:原始问题的等价表示
原始问题转化为以上公式的判定问题,判定公式最大值是否等于n;
对公式1进行优化,求和部分没有必要每次都运算n次,原因在于:在第一次有Sign(i,j+i-1) = 0的时候,就应该停止了;因此我们来假设一下,设第一次Sign函数在Sign(i,j+i-1) = 0的位置时,i的值为k+1,则公式1就可以写为下面的简化形式:
这里不难发现,以上两个公式所求问题是完全等价的。
重点2:推导公式2等价问题的性质
公式2中,存在两个不定量j和k,j与文本串有关,k与答案有关,因此使用一个函数f(j) = k 来完成从文本串到答案的映射。
故原问题就变成:寻找f(j)函数的最大值,等价为:max(f(j)) ?= n,设:
f(j) = k 条件1
f(j+e) = l 条件2
其中,l > k ,e表示满足条件的最小正整数,具体含义为:将来某一时刻能够找到一个后面的位置,使得其匹配成功的串长度比在它之前匹配成功的所有串长度k都更大,于是上述两个条件可等价为如下:
条件1等价为:A[1,k] = B[j,j+k-1]
条件2等价为:A[1,l] = B[j+e,j+e+l-1]
将两个条件中串对齐,看看我们能推出什么性质,并且这个性质是原问题的充分不必要条件(这个性质,虽然与原问题不等价,但是不满足这一性质,原问题肯定不成立):
另由j+e+l-1 = j+k-1 推出来 : l = k-e,于是再代入条件2的等价式中,有:
A[1,l] = A[1,k-e]=B[j+e,j+k-1],又由于公式1,所以A[1,l] = A[1+e,k]
由此,我们推导出f(j+e) > f(j)的一个重要性质,用短串来表达就是:A[1,k-e] = A[1+e,k],也就是通常所说的前半段等于后半段。
另外由于e是满足条件的最小正整数,所以A[1,k-e] = A[1+e,k]的含义如下:
1)物理含义是:前后最大长度相等的片段;
2)当k+1位置匹配失败的时候,如果此时A串前k位匹配成功了,说明从B串的j+e位开始匹配,最低能够匹配成功k-e位,那么下一次判断,应该是用A的k-e+1位跟B串的j+k位进行比较(对于这个性质的理解很重要,在重点三中会用到)。
重点3:推导k和e的映射关系
设有函数g(k)=k-e等价于A[1,k-e] = A[1+e,k],现在讨论g(k+1)值:
操作1:当A[k-e+1] = A[1+k]时,g(k+1)=g(k)+1
操作2:当A[k-e+1] != A[1+k]时,说明:A[1,k-e]A[k-e+1] 与串 A[e+1,k]A[k+1] 在最后一位上匹配失败了;将 A[e+1,k]A[k+1] 看做是文本串(与B串的性质类似),A[1,k-e]A[k-e+1] 看作模式串,根据以上推导,在k-e位匹配成功,k-e+1匹配失败的情况下,我们应该用A[g(k-e)+1](等价于A[g(g(k))+1])位于A[k+1]比较,如果两者相等,则进行操作1,否则继续操作2。
注意:由于我们的字符串下表是从1开始的,所以定义边界条件g(1)=0;如果从0开始,则g(1)=-1;
这里,对于函数g的理解非常重要,对于KMP算法的不同实现,其实就是在维护函数g中不同的变量值,由于变量涉及到k和e两个值,所以相应的,我们可以定义如下三种不同的g函数,每一种不同的g函数都对应了不同的KMP算法的具体实现:
g(k)= k-e
g(k)= -e
g(k)= e
OK,写到这里相信你已经具备了自己应用实践的能力了,得到了g函数(所谓的next数组)所有的对应关系后,怎样应用,请回顾重点2中的相关内容。
- KMP算法next推导
- KMP算法推导
- KMP算法推导
- KMP算法next数组推导
- KMP 算法的数学推导
- 字符串匹配之KMP算法推导过程
- [学习笔记]KMP匹配算法及next推导过程
- KMP之nextval推导
- KMP算法中next数组和nextval数组值的推导
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- K_means算法推导
- EM算法推导
- EM算法推导过程
- BP神经网络算法推导
- meanshift算法推导
- BP算法推导过程
- thinkjs判断访问是否是手机客户端方法
- 如何定位错误,上传了mapping为什么还有Unknown Source及混淆后 bug如何显示行号
- 解题报告:UVA_11235 Frequent Values RMQ_ST + 游程编码
- Java内存模型
- javascript格式化日期
- KMP算法推导
- Oracle字符集及其查看和修改
- javascript琐碎的知识点
- sql 知识点统计 多表sql查询连接
- 【错误记录】-eclipse 导入类 提示The import XXX cannot be resolved
- SYN 攻击原理以及防范技术
- SwipeRefreshLayout.setRefresh(true)指示器不显示
- Gallery的基本使用(实现了3D画廊的效果)
- Hessian知识学习总结(二)——Hessian的helloworld