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
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
相关文章推荐
- 内核配置
- 移动互联网时代: 妈,我回不去了
- 遍历包中的所有java类
- Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas
- JPA 分页处理
- opencv获取图像感兴趣部分
- MSP430F5529调试问题总结
- sdut 2159:Ivan comes again!(第一届山东省省赛原题,STL之set使用)
- 关于建站的小小建议
- 黑马程序员_学习笔记第10天——异常
- 队列(数组形式)实现_c++
- 手把手教您使用北美打折返利网
- 星期三
- 今天学习笔记--HTTP,HTML,CSS
- Object-c 加号 + 减号 -
- poj3414 pots(经典搜索题目, 题目本身不难,处理有点繁琐)
- 机器人常用软件
- java中的排序
- javascript中的小知识点
- 为什么要用_beginthreadex()替代CreateThread()