KMP中k=π[k](k=next[k])的理解

先贴出算法导论中的算法
在这里插入图片描述


对于k=π[k],想了好久才想明白。
当出现k=π[k]时,此时已经满足了 P 1 . . . P k = P q − k . . . P q − 1 P_1...P_k = P_{q-k}...P_{q-1} P1...Pk=Pqk...Pq1,正要判断 P k + 1 P_{k+1} Pk+1是否等于 P q P_q Pq,而发现 P k + 1 ≠ P q P_{k+1}\neq P_q Pk+1=Pq,因此进入while循环,执行 k = π [ k ] k=\pi [k] k=π[k],也就是说,此时 π [ q ] \pi[q] π[q]一定小于等于k,否则 P k + 1 = P q P_{k+1}= P_q Pk+1=Pq
在这里插入图片描述
此时应该想的是,找到最大的 i ,使得 P 1 . . . P i = P q − i + 1 . . . P q P_1...P_i = P_{q-i+1}...P_{q} P1...Pi=Pqi+1...Pq,这可以分为两步,先判断 P 1 . . . P i − 1 P_1...P_{i-1} P1...Pi1是否等于 P q − i + 1 . . . P q − 1 P_{q-i+1}...P_{q-1} Pqi+1...Pq1,若相等,再判断 P i P_i Pi是否等于 P q P_q Pq(而对于之前匹配的结果,有 P 1 . . . P k = P q − k . . . P q − 1 P_1...P_k = P_{q-k}...P_{q-1} P1...Pk=Pqk...Pq1,故只需判断 P 1 . . . P i − 1 P_1...P_{i-1} P1...Pi1是否等于 P k − i + 2 . . . P k P_{k-i+2}...P_{k} Pki+2...Pk),这时你就会发现,要找到最大的 i ,使得 P 1 . . . P i − 1 = P k − i + 2 . . . P k P_1...P_{i-1}=P_{k-i+2}...P_{k} P1...Pi1=Pki+2...Pk,这不就是 π [ k ] \pi [k] π[k]吗?然后问题就解决了。这里的第一步判断对应于 k = π [ k ] k=\pi [k] k=π[k],第二步则对应于while循环中的 P [ k + 1 ] ≠ P [ q ] P[k+1]\neq P[q] P[k+1]=P[q]

附上图便于理解
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值