浅谈KMP算法理解

说说我对KMP算法的理解

KMP算法是一种用于模式匹配的算法,其主要的特点是以空间换取时间,在提前得到next数组信息后,利用该信息减少指针回溯,提高了匹配效率。

主要的原理是利用了提前计算好匹配串内next数组的信息,该数组记录了匹配串内每位字符内存在的最长的匹配前后缀。例如
匹配串和next数组
next数组的计算是将匹配串上每位字符前的字符(包括自己本身)取前缀后缀进行对比,得到最长前后缀长度的便是该位字符的next值。
例如匹配串中的第二个A,此时需要取前后缀的范围是A B C D A。
前缀有[A],[A B],[A B C],[A B C D]
后缀有[A],[D A],[C D A],[B C D A]
可得到最长的前后缀公共部分为[A],可得到该个A的next数组值为1,以此类推可得其他部分的next值(记得是取最长部分的公共前后缀)

在理解了如何得到next数组后理解KMP使用就简单起来了
匹配串在和主串进行匹配的过程中需要移动的下标则不需要反复回溯,匹配串只需要按照下面的规则移动:
移动步数=已匹配字符数-最后一位匹配字符的next值

例如主串为:ABCDABABCDABCDABDE
匹配串为:  ABCDABD

第一次移动步数=已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4

例如主串为:ABCDABABCDABCDABDE
匹配串为:      ABCDABD

第二次移动步数 = 已经匹配字符数目(AB)- 最后一位匹配的字符next值 即 2-0=2

例如主串为:ABCDABABCDABCDABDE
匹配串为:        ABCDABD

第三次移动步数 = 已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4

例如主串为:ABCDABABCDABCDABDE
匹配串为:            ABCDABD

此时匹配完成得到主串中匹配的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值