KMP算法的前缀表

时间:2016-08-16 18:33:13

标签: 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];
        }else{
            F[i]=0;
            i++;
        }
     }
}

enter image description here

如上图像步骤5所示,i = 5,j = 3,j = F [j-1]被执行为j> 0。

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

1 个答案:

答案 0 :(得分:2)

j是模式中的位置。

如果图案被处理到某个位置&gt; 0,那么如果模式包含自身的前缀,我们就不能将模式转移到第一个(0)位置。

应用于您的示例:模式为 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("myCell") as! cellController let ciljZaPrikaz = listaObjekata[indexPath.item] cell.labelText.text = ciljZaPrikaz.imeCilja ?? "no text found" let path = getDocumentsDirectory().stringByAppendingPathComponent(ciljZaPrikaz.slikaCilja) cell.imageToShow.image = UIImage(contentsOfFile: path) return cell } 。尝试在文字ababaca中找到它:

  • 算法将处理文本,直到abababaca模式为ababa|baca
  • 将j设置为F [0] = 0,表示将模式设置为永远不会匹配ababa|c的{​​{1}}(请注意,我不会更改)
  • 将j设置为F [4] = 3,表示将模式设置为|ababac,其匹配baca
  • 匹配后,模式处于状态aba|bac,状态为baca,并且显示找到的模式为ababac|