您的位置:首页 > 其它

KMP

2014-04-16 20:58 232 查看
这个算法我觉得快要弄死我了

KMP解决字符串匹配问题,一段文本中某个特定的位置找出 某个特定的字符或模式。

BF算法简单暴力,算法复杂度高

S串,P串,在S中找到P

index i 标志 S i初始为0

index j 标志 P j初始为0

k表示 从S[i]和P[j]开始的能够匹配的字符的长度

一旦粗线 S[i+k]!=P[j],则i++,j=0,k=0

即P串只是向后滑动一个字符,算法复杂度为 O(n*m)

介绍KMP算法,可以优化算法到O(n+m)线性

KMP算法的核心在于增大向后滑动的程度,不像BF算法,只能向后滑动一个位置,KMP寻找最大滑动距离

核心思想:

P字符串为 abcdabd

每个位置作为截止点,找最大移动距离

最大移动距离的计算方法也很简单,前缀和后缀相等字串的长度,即为最大距离

这些计算过程,即为大名鼎鼎的p的next数组

我们看看

a next[0]=0

ab 木有公共子串 next[1]=0

abc 木有公共子串 next[2]=0

abcd 木有公共子串 next[3]=0

abcda 公共子串 a next[4]=1

abcdab 前缀 a,ab,abc,abcd 后缀 bcda,cda,da,a 最长的公共子串 ab ,长度为2 next[5]=2

abcdabd 木有公共子串 next[6]=0

计算next数组代码如下:

S串为BBC ABCDAB ABCDABCDABDE

http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: