我在 CLRS 自学问题 32-1;c) 部分介绍了以下字符串匹配算法:
REPETITION-MATCHER(P, T)
m = P.length
n = T.length
k = 1 + ρ'(P)
q = 0
s = 0
while s <= n-m
if T[s+q+1] == P[q+1]
q = q+1
if q==m
print "Pattern occurs with shift" s
if q==m or T[s+q+1] != P[q+1]
s = s+max(1, ceil(q/k))
q = 0
这里,ρ'(P),它只是 P 的函数,被定义为最大整数 r,使得某个前缀 P[1..i] = y^r,例如重复 r 次的子串 y。
该算法似乎与简单的暴力字符串匹配器有 95% 的相似性。然而,让我非常困惑的一个部分,似乎是整个算法的核心,是倒数第二行。这里,q 是到目前为止匹配的 P 的字符数。背后的原理是ceil(q/k)
什么?这对我来说是完全不透明的。如果该行类似于s = s + max(1+q, 1+i)
,那将更有意义,其中 i 是产生 ρ'(P) 的前缀的长度。
CLRS 声称该算法归功于 Galil 和 Seiferas,但在他们提供的参考资料中,我找不到与上面提供的算法相似的任何东西。如果有的话,参考似乎包含这里的更高级版本。有人可以解释这个ceil(q/k)
值,和/或指向描述这个特定算法的参考,而不是更知名的主要 Galil Seiferas 论文吗?