【问题标题】:KMP table satement difficultyKMP 表状态难度
【发布时间】:2014-09-17 17:03:07
【问题描述】:

请解释为什么我们在下面的代码中用 next[j-1] 代替 j 的值: http://computing.dcu.ie/~humphrys/Notes/String/kmp.html 点击链接了解表格概念

i = 0

next[i] = 0
i++
j = 0


while ( i < m )
{
 if ( pattern[j] == pattern[i] )
 {
     next[i] = j+1
     i++
     j++
 }
 else ( pattern[j] != pattern[i] )
 {
     if ( j > 0 )
      j = next[j-1]   //this part i am not able to figure out
                      //why don't we just decrement j-1?

 else ( j == 0 )
 {
  next[i] = 0
  i++
  j = 0             
 }
 }
 }

【问题讨论】:

    标签: algorithm pattern-matching substring dynamic-programming


    【解决方案1】:

    这里j 跟踪到目前为止匹配的长度,i 跟踪当前正在处理的字符串的位置。因此,如果j 长度的匹配在i 位置失败,该函数会尝试找到小于j 长度匹配的最长的。所以它将 j 更改为 next[j - 1] 将 i 保持在同一位置。

    请注意,next[x] 包含迄今为止最长匹配的长度。如果在第 i 个索引处匹配长度 j 失败,则可以确定没有长度为 j 的文本的前缀与此处匹配。所以我们应该在j - 1查找匹配,它会不断尝试,直到找到具有某个正长度的匹配字符串前缀或j变为0。

    【讨论】:

    • 那么我们为什么不把 j 减 1 呢?
    • 说这个字符串,ABACABA,现在当 i 为 6 时,前缀-后缀匹配为 3,所以 j 为 3。现在让我们在最后附加 A。所以它变成了ABACABAA,现在 A 与 C 不匹配,所以让我们将 j 减 1,然后它变为 2,patter[2] = 'A',所以 patter[2] 匹配最后一个字符,我们得到长度为3的匹配,这是不正确的。但请注意,根据原始算法,next[2] = 1,所以我们会得到 j = next[j - 1] = next[ 3 - 1 ] = 1 实现该算法。那么pattern[j] = pattern[7],所以pattern[7] = 1。这只是为了让答案更清楚
    猜你喜欢
    • 2020-07-12
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多