🔴 同样三种情况,KMP 一动不动
同一段文本、同样是 4、6、8 个 a 的模式,这次数 KMP 的比较次数:
T24 = "a" * 24
def brute_cmp(t, p):
c = 0
for i in range(len(t) - len(p) + 1):
j = 0
while j < len(p):
c += 1
if t[i + j] != p[j]:
break
j += 1
return c
def build_next(p):
f = [0] * len(p)
k = 0
for i in range(1, len(p)):
while k and p[i] != p[k]:
k = f[k - 1]
if p[i] == p[k]:
k += 1
f[i] = k
return f
def kmp_cmp(t, p):
f = build_next(p)
c = 0
k = 0
for i in range(len(t)):
while k and t[i] != p[k]:
k = f[k - 1]
c += 1
c += 1
if t[i] == p[k]:
k += 1
if k == len(p):
k = f[k - 1]
return c
print("/".join(str(kmp_cmp(T24, "a" * m)) for m in (4, 6, 8)))
全部评论