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中的相关内容。





1 0
原创粉丝点击