kmp
来源:互联网 发布:java的封装性 编辑:程序博客网 时间:2024/05/01 02:40
转自:http://duanple.blog.163.com/blog/static/709717672009825004092/
kmp
首先这个匹配算法,主要思想就是要充分利用上一次的匹配结果,找到匹配失败时,模式串可以向前移动的最大距离。这个最大距离,必须要保证不会错过可能的匹配位置,因此这个最大距离实际上就是模式串当前匹配位置的next数组值。也就是max{Aj 是 Pi 的后缀 j < i},pi表示字符串A[1...i],Aj表示A[1...j]。模式串的next数组计算则是一个自匹配的过程。也是利用已有值next[1...i-1]计算next[i]的过程。我们可以看到,如果A[i] = A[next[i-1]+1] 那么next[i] = next[i-1],否则,就可以将模式串继续前移了。
整个过程是这样的:
void next_comp(char * str){
int next[N+1];
int k = 0;
next[1] = 0;
//循环不变性,每次循环的开始,k = next[i-1]
for(int i = 2 ; i <= N ; i++){
//如果当前位置不匹配,或者还推进到字符串开始,则继续推进
while(A[k+1] != A[i] && k != 0){
k = next[k];
}
if(A[k+1] == A[i]) k++;
next[i] = k;
}
}
复杂度分析:从上面的过程可以看出,内部循环再不断的执行k = next[k],而这个值必然是在缩小,也就是是没执行一次k至少减少1;另一方面k的初值是0,而最多++ N次,而k始终保持非负,很明显减少的不可能大于增加的那些,所以整个过程的复杂度是O(N)。
上面是next数组的计算过程,而整个kmp的匹配过程与此类似。
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- KMP
- KMP
- kmp
- KMP
- 计算机视觉会议时间表
- Android的日积月累-问题解决
- EditText
- pthread
- Qt安装—图文并茂搭建VS2008+QT开发环境
- kmp
- php截取中文字符,去html标记,count用法
- 面试(2)
- 从nfs_page结构看PNFS读写流程
- java.io.IOException: No space left on device
- C#如何获得屏幕宽度和高度
- oracle替换文本中的换行符、回车符、制表符
- 用Live555 中的openRTSP 保存H264文件
- 大型网站系统架构分析(转载自博客园)