Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm KMP算法的前缀表_Algorithm_String Matching - Fatal编程技术网

Algorithm KMP算法的前缀表

Algorithm KMP算法的前缀表,algorithm,string-matching,Algorithm,String Matching,我正在学习KMP算法。尽管这个算法很容易理解,但我有一个疑问 前缀表算法: void prefixTable(char p[], int m){ int i=1, j=0, F[0] = 0; while(i<m){ if(p[i]==p[j]){ F[i]=j+1; i++; j++; }else if(j>0){ j=F[j-1];

我正在学习KMP算法。尽管这个算法很容易理解,但我有一个疑问

前缀表算法:

void prefixTable(char p[], int m){
     int i=1, j=0, F[0] = 0;
     while(i<m){
        if(p[i]==p[j]){
            F[i]=j+1;
            i++;
            j++;
        }else if(j>0){
            j=F[j-1];
        }else{
            F[i]=0;
            i++;
        }
     }
}
void前缀可压缩(字符p[],int m){
int i=1,j=0,F[0]=0;
while(i0){
j=F[j-1];
}否则{
F[i]=0;
i++;
}
}
}

如上图5所示,i=5,j=3,j=F[j-1]在j>0时执行

为什么我们要取F[j-1]?为什么不能直接使用F[0]?
它如何确保算法的正确性?

j是模式中的位置

如果模式被处理到某个位置>0,那么如果模式包含其自身的前缀,则我们无法将模式移动到第一(0)个位置

应用于您的示例:模式为
ababaca
。尝试在文本中找到它
abababaca

  • 算法将处理文本,直到模式为
    ababa|c
  • 将j设置为F[0]=0,意味着将模式设置为
    |ababac
    ,这将永远不会匹配
    baca
    (注意,我不会更改)
  • 将j设置为F[4]=3,意味着将模式设置为
    aba | bac
    ,这将匹配
    baca
  • 匹配后,模式处于状态
    abababac |
    ,文本处于状态
    ababababac | a
    ,很明显找到的模式是
    ab[abababac]a

正如您在第三点中所解释的,为什么在构建前缀函数时要使用F[j-1]?如何确保得到正确的比较位置?KMP算法设计为永不回溯。这意味着一旦到达文本中的某个位置,指针将永远不会移动到此位置之前。因此,必须调整图案中的位置以匹配文本位置。计算F[i]时,它总是包含与文本位置对齐的右移。扫描直接从Narasisha Karumachi的书中进行。这是一本精彩的读物!有关职位-&