Knuth-Morris-Pratt算法:边界数组

时间:2017-02-18 17:50:52

标签: string algorithm knuth-morris-pratt

这是一个用于计算KMP中边界数组的伪代码 p是模式

border[1]:=-1
i:=border[1]
for j=2,...,m
    while i >= 0 and p[i+1] != p[j-1] do i = border[i+1]
    i++
    border[j]:=i

我可以执行以下伪代码来计算边界数组,但我现在遇到的问题是我并不真正理解边界数组的意思,如何解释它。
例如,如果模式在位置(i + 1)和(j-1)不相等,则变量i被设置为border [i + 1]。为什么这样呢?

当我试图回答边框数组中的三个连续条目与前一个条目不能相差一个问题时,我意识到了缺失的理解。例如。 border [10] = 3,border [11] = 2,border [12] = 1

我希望得到一个很好的解释,以便更好地理解。

1 个答案:

答案 0 :(得分:0)

你称之为border数组的是前缀函数。 有许多解释,请参阅StackoverflowWikipedia或仅google更适合您的解释。

至于问题的第二部分,以下字符串是您要求的属性的示例:

column:  0123456
string:  abcabac
border:  0001210

此处,border[4] = 2因为ab = abborder[5] = 1因为a = aborder[6] = 0

这三个值是否都可以为非零(例如,3,2,1)是一个有趣的问题。