from time import process_time_ns
def initial_hash(desired):
u=0
for i in desired:
u=(u*256+ord(i))%89
return u
def find(Document):
initial=Document[:len(desired)]
hash_1=initial_hash(initial)
for i in range(1,len(Document)-len(desired)+1):
hash_1=skip(Document[i-1],hash_1)
hash_1=append(Document[len(desired)+i-1],hash_1)
def append(char,u):
u=(u*256+ord(char))%89
return u
def skip(char,u):
u=(u-(ord(char)*(constante)))%89
return u
to=process_time_ns()
desired="ababa"
constante=(256**(len(desired)-1))%89
hash_desired=initial_hash(desired)
text=open("match.txt","r")
for x in text:
find(x)
print(process_time_ns()-to)
我已经按照 MIT course 6006 实现了这段代码。我在上面的代码中使用了一些标记来查看时间。我将其更改match.txt
为许多不同的大小以及desirable
变量,这是我想在文档中找到的那个。但是对于很多变体,链接中描述的朴素算法总是更快。我选择 89 作为素数。代码基于此链接: