数据结构 KMP 算法实现
2013-05-20 01:49
344 查看
数据结构 KMP 算法实现
KMP 算法关键是要求出next数组下面是求next数组的算法
n利用next[0]= -1,…,next[i] 求next[i+1] 的算法:
假设 k =next [i],
1) 若pk = pi, 则 p0… pi-k…pi 中最大相同前后缀长度为next[i+1] = k+1
2)若pk ¹ pi ,置 k=next[k] ,然后转到 第1步.
(设 k = next[k],就是考虑前一个更短的匹配前缀,从那里继续向下检查)
3)若 k 值(来自next)为-1,就得到p0… pi-k…pi中最大相同前后缀的长度为k = 0(即next [i+1] = 0)
对求next数组的改进
n当 pi != tj 时,若pi == pk, 那么一定有 pk != tj .所以模式串应再向右移 k-next[k]位,下一步用 pnext[k] 与tj比较
n对于next[i]=k 的改进:
这一改进可以避免一些不必要的操作.
下面是一个例子:
结果:
KMP 算法关键是要求出next数组下面是求next数组的算法
n利用next[0]= -1,…,next[i] 求next[i+1] 的算法:
假设 k =next [i],
1) 若pk = pi, 则 p0… pi-k…pi 中最大相同前后缀长度为next[i+1] = k+1
2)若pk ¹ pi ,置 k=next[k] ,然后转到 第1步.
(设 k = next[k],就是考虑前一个更短的匹配前缀,从那里继续向下检查)
3)若 k 值(来自next)为-1,就得到p0… pi-k…pi中最大相同前后缀的长度为k = 0(即next [i+1] = 0)
对求next数组的改进
n当 pi != tj 时,若pi == pk, 那么一定有 pk != tj .所以模式串应再向右移 k-next[k]位,下一步用 pnext[k] 与tj比较
n对于next[i]=k 的改进:
if (pk== pi) next[i] = next[k]; else next[i]=k;
这一改进可以避免一些不必要的操作.
下面是一个例子:
/*============================================================================*\ * * 数据结构基础练习 * * KMP 算法测试 * * 2013-05-20 by 樊列龙 * \*============================================================================*/ #include <iostream> using namespace std; void set_next(char* p, int* next) { int i = 0, j= -1; next[0] = -1; while(p[i]) { while(j >= 0 && p[i] != p[j]) { j = next[j]; } i++,j++; if(p[i] == p[j]) next[i] = next[j]; else next[i] = j; } } int KMP(char* s, char* p, int *next, int n) { int i = 0,j = 0; int count = 0; while(s[i] && j < n) { if(j == -1 || s[i] == p[j]) { j++,i++; count++; } else { j = next[j]; } } if(j >= n) { return i-n+1; } return 0; } int main() { char s[] = "abaabca8934baaabaabc23abaabcaca2312"; char p[] = "abaabcac";//8个字符 int next[100]; set_next(p,next); cout << KMP(s,p,next,sizeof(p)-1) << endl; return 0; }
结果:
23
相关文章推荐
- KMP算法之最终实现及优化 – 数据结构和算法39
- 【数据结构&&等差数列】KMP简介和算法的实现(c++ && java)
- 【数据结构&&等差数列】KMP简介和算法的实现(c++ && java)
- KMP算法之最终实现及优化 - 数据结构和算法39
- C++类模板 实现两栈共享数组空间的算法 《数据结构》(北京科海) 自己摘抄完成
- 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)
- scala数据结构和算法-01-用scala实现合并排序
- 【算法数据结构Java实现】Java实现单链表
- 数据结构 P20 算法实现 —A=AUB和归并排序
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 数据结构与算法之—顺序栈c++面向对象实现
- 赫夫曼编码C语言实现 - 数据结构和算法53
- 数据结构常用算法实现print
- 基于Excel的神经网络工具箱(之一)——DNN神经网络数据结构的算法实现
- 《常见算法和数据结构》优先队列(1)——API和初等实现
- 平衡二叉树的实现原理(代码实现)- 数据结构和算法78
- 实现一个拼图算法和数据结构
- 几道经典的数据结构算法代码实现(1)
- 《 常见算法与数据结构》符号表ST(2)——初等实现分析和有序符号表
- 【算法数据结构Java实现】时间复杂度为O(n)的最大和序列