Я реализую алгоритм Рабина-Карпа для удовольствия. Я наткнулся на этот псевдокод:Python: алгоритм алгоритма Рабина-Карпа
RABIN -KARP -MATCHER (T, P, d, q)
1 n = T.length
2 m = P.length
3 h = d^(m-1) mod q
4 p=0
5 t= 0
6 for i = 1 to m
/preprocessing
/
7 p = (dp + P [i]) mod q
8 t = (dt + T [i]) mod q
9 for s = 0 to n-m
/matching
/
10 if p == t
11 if P [1... m] == T [s + 1...s + m]
12 print “Pattern occurs with shift” s
13 if s < n-m
14 t = (d(t-T[s + 1]h) + T [s + m + 1]) mod q
Я реализовал в Python 2.7 следующим образом:
def Rabin_Karp_Matcher(text, pattern, d, q):
n = len(text)
m = len(pattern)
h = pow(d,m-1)%q
p = 0
t =0
result = []
for i in range(m): # preprocessing
p = (d*p+ord(pattern[i]))%q
t = (d*t+ord(text[i]))%q
for s in range(n-m):
if p == t: # check character by character
match = True
for i in range(m):
if pattern[i] != text[s+i]:
match = False
break
if match:
result = result + [s]
if s < n-m:
t = (d*(t-ord(text[s+1])*h)+ord(text[s+m]))%q #index out of bounds here
return result
где результат список, содержащий индекс в тексте шаблона.
Мой код не находит 26 в 3141592653589793 , и я подозреваю, что он имеет какое-то отношение к моему хэш-коду, определенному строкой 14 псевдокода. Кто-нибудь может помочь с этим.
я проходил в следующих paramters:
P = "26" Т = "3141592653589793" д = 257 д = 11
Р и Т должны быть строками/массивов символов
Это замечательно! Спасибо. – SeekingAlpha
Итак, есть ошибка в псевдокоде, не так ли? С отсутствующим модулем в вычислении хэша. Потому что это из книги алгоритмов Кормена, и это так странно, что там есть ошибка, я потратил некоторое время, пытаясь найти ошибку в моем коде или понимании, и из того, что я вижу - в самой формуле есть ошибка. –