【问题标题】:KMP pattern find algorithmKMP 模式查找算法
【发布时间】:2016-11-20 00:36:30
【问题描述】:

我确实了解KMP算法,即存储值以匹配带有前缀的后缀然后在字符串中搜索时不返回的概念,因为模式“abcdabca”前缀数组将是{0,0,0, 0,1,2,3,1} 我知道直到 {0,0,0,0,1,2,3,_} 然后第 4 位的“d”最后与“a”不匹配。然后算法说如果 j!=0 回到 arr[j-1],我可以看到这给了我们正确的结果,但我不明白为什么我们要回到前一个 element[data]理解基础。

我们返回直到找到匹配元素或 j==0,我无法理解为什么要返回。

谢谢

【问题讨论】:

  • 了解不匹配问题并不是一件简单的事情。试试这个例子和更多例子,用手在纸上弄明白。

标签: algorithm string-matching


【解决方案1】:

在我自己的理解中,我们使用失败函数F[i]来表示最长前缀的从0开始的索引,它与子字符串S[0...i]的后缀相同(最长,我的意思是最长的不是整个子字符串本身)

从您的 OP 来看,我认为您的实现或教程使用的是基于 1 的,但这完全取决于实现

考虑以下示例:S = abababcabab

失败函数类似于F = [-1,-1,0,1,2,3,-1,0,1,2,3]

您可能会仔细观察,当算法在完成计算 S' = ababab???? 和 F = [-1,-1,0,1,2,3,?,?,?,?,?] 的故障函数时发生了什么

现在下一个字符是c,算法将测试它是否可以在已知的最长前缀(后缀)abab 上附加一个更长的前缀。测试失败,前缀ababa != 后缀ababc,然后呢?

然后该算法将尝试查找失败的最长前缀(后缀)的最长前缀(后缀),然后查看挂起的c 会给我们一个匹配项(如果是的话) ,那么这就是答案)。

这意味着算法将测试abab的最长前缀(后缀),即ab,我们可以很快知道,因为我们知道F(abab) = 3(我们测试附加c 并失败)我们知道F(F(abab)) = F(3) = 1,这是ab 的位置。

同样的事情递归地发生,直到你说我们找到匹配或根本没有匹配。匹配失败时F[]的“跳跃”就是实现这个过程:测试下一个潜在的最长前缀(后缀),如果失败,找到下一个……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    相关资源
    最近更新 更多