String 克努特–;莫里斯&x2013;Pratt算法:边界数组

String 克努特–;莫里斯&x2013;Pratt算法:边界数组,string,algorithm,knuth-morris-pratt,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设置为边界[i+1]。例如

这是一个伪代码,用于计算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设置为边界[i+1]。例如,为什么会这样

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


为了更好地理解,我希望您能给我一个好的解释。

您所说的边界数组是前缀函数。 有很多解释,你看,或者只是一个更适合你的解释

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

column:  0123456
string:  abcabac
border:  0001210
这里,
border[4]=2
因为
ab=ab
border[5]=1
因为
a=a
,而
border[6]=0


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

您所称的边界数组是前缀函数。 有很多解释,你看,或者只是一个更适合你的解释

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

column:  0123456
string:  abcabac
border:  0001210
这里,
border[4]=2
因为
ab=ab
border[5]=1
因为
a=a
,而
border[6]=0


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

我实际上在谷歌上搜索了很多,但我找不到有助于更好理解的解释。我找到的所有解释都是解释算法是如何进行的,而不是它背后的真正想法。@tumbler我实际上已经用不同的方法向学生解释了很多次KMP。通常有一个学生会说,“嘿,这次我听到了第四种解释,现在它有了完美的解释!”。然而,大多数人都会说“嗯,我确实理解……总的来说……”。所以,我不知道一个通用的方式来解释国民党;根据我的经验,理解它需要听——或读——一些不同的解释,直到其中一个“点击”你(但可能不适合其他人)。我实际上在谷歌上搜索了很多,但我找不到一个有助于更好理解的解释。我找到的所有解释都是解释算法是如何进行的,而不是它背后的真正想法。@tumbler我实际上已经用不同的方法向学生解释了很多次KMP。通常有一个学生会说,“嘿,这次我听到了第四种解释,现在它有了完美的解释!”。然而,大多数人都会说“嗯,我确实理解……总的来说……”。所以,我不知道一个通用的方式来解释国民党;根据我的经验,理解它需要听——或者读——一些不同的解释,直到其中一个对你来说“咔哒”一声(但对其他人来说可能不是)。