对KMP算法的认识

最近在看数据结构和算法,看到了串的那一块想到考研时学的KMP算法,于是上网查了查,又结合一下记忆争取能找回来。

有next和nextval两个数组的。其中next是一个初始的模式匹配,nextval是对它的改进。
详见http://www.bsdlover.cn/html/21/n-3021.html
设模式串为T,next和nextval都是从1开始的,而不是从0开始的。
求next数组的方法是:
1.第一第二位肯定是0,1这是定死的。
2.从第二位往后,看要要填位的前一位值,即要填第n位的next值要看第n-1位的值T[n-1]。看T[n-1]的值是不是等于T[next[n- 1]],如果是那么next[n]就等于next[n-1]+1,如果不等于就使T[n-1]与T[next[next[n-1]]]比,直到相等为止, 那么next[n]就等于相等时的next[*]+1,这个next是最外层的next。如果一直都不相等,则next[n]等于1。
求nextval数组的方法是:
1.第一位一定是0,这是定死了的。
2.从第一位往后,要看要填位next数组和模式串的值,即要填第n位的nextval值要看第n为的next的值next[n]。看T[n]是否等于 T[next[n]],如果不相等,那么nextval[n]就等于next[n]。如果相等则比较T[n]与T[next[n]],如果相等就再继续比 较T[n]与T[next[next[n]]],直到不等为止,这时nextval[n]等于不相等时的next[*],这个next是最外层的 next。如果一直都相等,则nextval[n]等于0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值