KMP算法的理论推导

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

改进的模式匹配算法的理论分析

T = t0 t1 … t s-1 t s t s+1 t s+2 … t s+j-1 t s+j t s+j+1 … t n-1

P = p0 p1 p2 … p j-1 p m-1.

若在匹配过程中出现了如下情况:

t s t s+1t s+2… t s+j-1= p0p1p2… p j-1,(1)但t s+j ≠ p j.也就是说,在匹配过程出现了:

T t0 t1 … t s-1t s t s+1t s+2… t s+j-1t s+j t s+j+1… t s+m-1 … t n-1

‖ ‖ ‖ … ‖ ⨯

P p0p1p2 … p j-1p j p j-1… p m-1

则本次匹配失败.

由朴素的模式匹配算法,我们需要下一趟匹配,即需要验证下式是否成立:

t s+1t s+2… t s+j-1 t s+j … t s+m?= p0p1 … p j-2p j-1… p m-1(2)如果(2)式成立,则匹配成功,返回s+1;否则需要再下一趟的匹配:t s+2t s+3… t s+j-1t s+j… t s+m+1?= p0p1… p j-3p j-2 …p m-1 (2')以此类推.

下面给出两个互逆的条件

p0p1… p j-2 = p1p2 …p j-1 (3)

p0p1… p j-2 ≠p1p2 …p j-1 (3')显然,这两个条件能且只能满足一个.下面并分情况讨论:【1】如果(3) 式成立,则由(1) (2) (3) 式,可以断定p0 p1 …p j-2 = t s+1 t s+2 … t s+j-1成立,即在(3)式条件下,对(2) 式的验证只需要从p j-

和t s+j 开始逐个往后比较,而不必从p0 和t s+2 开始.

1

【2】如果(3') 式成立,则由(1) (2) (3') 式,可以断定p0 p1 …p j-2 ≠t s+1 t s+2 … t s+j-1成立,即在(3')式条件下,(2)式一定不能成立,应该直接进行下下次验证,即对(2') 进行验证.

对于(2'),也引进两个互逆的条件

p0p1… p j-3 = p2p3 …p j-1 (4)

p0p1… p j-3 ≠p2p3 …p j-1 (4')这两个条件也是只能满足一个,分情况讨论:

【2.1】如果(4) 式成立,则由(1) (2') (4),可以断定p0 p1 …p j-3 = t s+2 t s+3 … t s+j-1成立,即:对(2') 式的判断从p j-2和t s+j开始逐个往后比较,而不必从p0和t s+2开始.

【2.2】如果(4')式成立,则由(1) (2') (4'),可断定p0 p1 …p j-3 ≠t s+2 t s+2… t s+j-1成立,即(2')一定不成立,应该开始再下一次的判断,即:t s+3 t s+4 … t s+j-1 t s+j … t s+m+2 ?= p0 p1 … p j-4 p j-3 …p m-1没必要再往下做了,下面把刚才的两次匹配过程总结一下,找出规律来:

【1】如果(3) 式成立,则对(2)式的验证可以从p j-1和t s+j开始继续往后进行,而不必从p0和t s+1开始.

【2】如果(3') 成立,则需要进行下下次匹配【见(2')式】:

【3】如果(3') 和(4) 式成立,则对(2') 式的验证可以从p j-2和t s+j开始继续往后进行,而不必从p0和t s+1开始.

【4】如果(3') 和(4') 式成立,则需要进行下下下次匹配:t s+3 t s+4 … t s+j-1 t s+j … t s+m+2 ?= p0 p1 … p j-4 p j-3 …p m-1

由刚才总结的第【3】种情况,我们可以设想存在一个k,使得

p0p1… p j-2 ≠p1p2 …p j-1 (3')

p0p1… p j-3 ≠p2p3 …p j-1 (4')

… … … …

p0p1… p k ≠p j-k-1p j-k …p j-1 (5')

p0p1… p k-1 = p j-k p j-k+1 …p j-1 (6)显然,如果这样的k 存在,则0 <= k < j-1(当k == 0 时,(6)式的左右都为空串).

再由刚才总结的第【2】和【4】种情况可知:如果(3') (4') …(5') 都成立,哪些判断不用做了呢?这需要发现(2)、(2') 的变化规律.刚才,由(3') 式,则(2) 式不用再判断了;由(4') 式,则(2') 式不用再判断了.换句话说,根据(5') 式,

●当k = j – 2时【(3')式成立】,(2)式不用判断了;

●当k = j – 3时【(4')式成立】,(2')式不用判断了;

●… …

由此可以推出:当k时,下面的(7) 式不用判断了

t s+j-k-1t s+j-k… t s+j-1t s+j… t s+j-k+m-2 ?= p0p1… p k p k+1… p m-1 (7)也就是说,当k 时,也就是(5') 成立时,(7) 式子不用判断了.此时需继续判断如下的(8) 式是否成立

t s+j-k t s+j-k+1… t s+j-1t s+j… t s+j-k+m-1?= p0p1… p k-1p k… p m-1 (8)由(6) 式和(8) 式,再考虑到(1) 式并改写(1) 式

t s t s+1… t s+j-k t s+j-k+1… t s+j-1= p0p1… p j-k p j-k+1 …p j-1(1)可以断定:p0 p1 …p k-1 = t s+j-k t s+j-k+1 … t s+j-1,因此,下次比较从p k和

相关文档
最新文档