您的位置:首页 > 理论基础 > 数据结构算法

数据结构 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 的改进:

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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐