KMP算法的理论推导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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和