实施 knuth morris pratt 算法的问题
Issue in implementing knuth morris pratt algorithm
我正在尝试实施 Knuth Morris Pratt 算法以在 java 中进行模式搜索,但它没有给出任何结果
prefixTable 生成器代码运行良好,因为我已经检查过了,但是用于搜索的主要代码不起作用
public void KMPAlgorithm(String T, String P){
int pi[]= prefixFinder(P);
int n=T.length();
int m=P.length();
int q=0;
for(int i=0; i<m; i++)System.out.print(pi[i]+" ");
for(int i=0; i<n; i++){
while(q>0 && P.charAt(q)!=T.charAt(i)){
q=pi[q-1];
}
if(P.charAt(q)==T.charAt(i)){
q++;
}
if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
}
这是前缀生成器算法
private int[] prefixFinder(String P){
int m=P.length();
int pi[]= new int[m];
pi[0]=0;
int k=0;
for(int i=1;i<m; i++){
while( k>0 && P.charAt(k)!=P.charAt(i)){
k=pi[k];
}
if(P.charAt(k)==P.charAt(i)){
k++;
}
pi[i]=k;
}
return pi;
}
作为输出,它没有给出任何空白,表明它没有找到模式
在一些边界情况下
您的 q 变量没有检查最后一个字母,因为您在它到达 m-1 而不是 m 时更改了 q。
所以这一行需要从this改为
if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
if(q==(m)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
此外,由于您的 q 现在在末尾,您还需要更改
q=pi[q];
至
q=pi[q-1];
我正在尝试实施 Knuth Morris Pratt 算法以在 java 中进行模式搜索,但它没有给出任何结果 prefixTable 生成器代码运行良好,因为我已经检查过了,但是用于搜索的主要代码不起作用
public void KMPAlgorithm(String T, String P){
int pi[]= prefixFinder(P);
int n=T.length();
int m=P.length();
int q=0;
for(int i=0; i<m; i++)System.out.print(pi[i]+" ");
for(int i=0; i<n; i++){
while(q>0 && P.charAt(q)!=T.charAt(i)){
q=pi[q-1];
}
if(P.charAt(q)==T.charAt(i)){
q++;
}
if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
}
这是前缀生成器算法
private int[] prefixFinder(String P){
int m=P.length();
int pi[]= new int[m];
pi[0]=0;
int k=0;
for(int i=1;i<m; i++){
while( k>0 && P.charAt(k)!=P.charAt(i)){
k=pi[k];
}
if(P.charAt(k)==P.charAt(i)){
k++;
}
pi[i]=k;
}
return pi;
}
作为输出,它没有给出任何空白,表明它没有找到模式 在一些边界情况下
您的 q 变量没有检查最后一个字母,因为您在它到达 m-1 而不是 m 时更改了 q。 所以这一行需要从this改为
if(q==(m-1)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
if(q==(m)){System.out.println("Pattern occurs at "+(i-(m-1)));
q=pi[q];
}
此外,由于您的 q 现在在末尾,您还需要更改
q=pi[q];
至
q=pi[q-1];