为了使 Boyer-Moore 算法成为最坏情况线性,失配表的计算必须是 O(m)。然而,一个简单的实现将遍历所有后缀 O(m) 以及该后缀中的所有位置可以检查是否相等......这是 O(m 3 )!
下面是建表算法的简单实现。所以这个问题变成了:我怎样才能把这个算法的运行时间提高到 O(m)?
def find(s, sub, no):
n = len(s)
m = len(sub)
for i in range(n, 0, -1):
if s[max(i-m, 0): i] == sub[max(0, m-i):] and \
(i-m < 1 or s[i-m-1] != no):
return n-i
return n
def table(s):
m = len(s)
b = [0]*m
for i in range(m):
b[i] = find(s, s[m-i:], s[m-i-1])
return b
print(table('anpanman'))
为了让思想休息,这不是家庭作业。当有人发布改进想法时,我会添加修订。