KMP模板与讲解
2013-11-08 21:47
183 查看
读书笔记终于写完了,写一下我对KMP的理解。
KMP的思想就是尽量利用已经得到的信息,来降低时间复杂度,已经得到的信息存放在next数组里。算法确实很难理解,所以很难讲解。。举个例子来说吧。
设字符串是str[],next[5] = 2。
就表示str[5]前面的2个字符,与str[2]前面的2个字符相同,也就是str[0] == str[3], str[1] == str[4],这样把str[2]平移到str[5]的位置以后,就能保证前面的已经匹配了。就是下图:
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
这时候在下标为5的位置,d和c是不匹配的,因为next[5] = 2,所以把下标为2的c平移到下标为5的位置,再次比较。
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
当下标超出待匹配的字符串的长度时,就说明在目标串中找到了该字串。
这里还有一个定理:next数组中的值就是"前缀"和"后缀"的最长的共有元素的长度。
还有一句“名言”:假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?
最后是几篇比较好的讲解KMP的文章,讲解方式各不相同,但是都讲得特别好。
http://www.matrix67.com/blog/archives/115
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
/article/1362918.html
View Code
KMP的思想就是尽量利用已经得到的信息,来降低时间复杂度,已经得到的信息存放在next数组里。算法确实很难理解,所以很难讲解。。举个例子来说吧。
设字符串是str[],next[5] = 2。
就表示str[5]前面的2个字符,与str[2]前面的2个字符相同,也就是str[0] == str[3], str[1] == str[4],这样把str[2]平移到str[5]的位置以后,就能保证前面的已经匹配了。就是下图:
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
这时候在下标为5的位置,d和c是不匹配的,因为next[5] = 2,所以把下标为2的c平移到下标为5的位置,再次比较。
目标串 ..........a b c.........
str[] a b c a b d e f
下标 0 1 2 3 4 5 6 7
当下标超出待匹配的字符串的长度时,就说明在目标串中找到了该字串。
这里还有一个定理:next数组中的值就是"前缀"和"后缀"的最长的共有元素的长度。
还有一句“名言”:假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?
最后是几篇比较好的讲解KMP的文章,讲解方式各不相同,但是都讲得特别好。
http://www.matrix67.com/blog/archives/115
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
/article/1362918.html
void kmp(char target[], char source[]) { int n = strlen(target); int m = strlen(source); int *next = new int[m]; int j = -1; next[0] = -1; for(int i = 1; i < m; i++) { while(j >= 0 && source[j+1] != source[i]) j = next[j]; if(source[j+1] == source[i]) j++; next[i] = j; } j = -1; for(int i = 0; i < n; i++) { while(j >= 0 && source[j+1] != target[i]) j = next[j]; if(source[j+1] == target[i]) j++; if(j >= m-1) { printf("%d\n", i-m+1); j = next[j]; //继续查找更多 //return; //不再继续查找 } } }
View Code
相关文章推荐
- KMP模板 POJ 3461 KMP模板讲解
- kmp讲解 & 模板
- KMP·模板讲解
- KMP模板1(便于理解)(poj3461)
- 【KMP模板】简单写个KMP~
- KMP模板
- [洛谷3375]【模板】KMP字符串匹配
- 自己的KMP模板
- 【KMP 模板】
- luogu P3375 【模板】KMP字符串匹配
- 邝斌的ACM模板(扩展 KMP)
- 史上最详尽的平衡树(splay)讲解与模板
- HDU - 1711 Number Sequence(kmp 模板)
- 【HDU 1711】Number Sequence 【KMP 模板】
- KMP模板题汇总(更新中。。。)
- HDU 1711 KMP模板
- KMP 算法模板
- KMP模板
- 扩展kmp模板
- hdu2087-自己的理解&kmp讲解-剪花布条