我正在尝试用Python实现Monte Carlo Rabin-Karp搜索。 这是我到目前为止(random_prime是一个函数,它返回的素数小于给出的极限争论):
def search(pattern, text):
m = len(pattern)
n = len(text)
q = random_prime(m*n*n)
r = (2^(m - 1)) % q
f = []
for x in range (0, n + 1):
f.append(0)
pFinger = 0
for j in range(0, m):
f[0] = (2 * f[0]) + (int(text[j]) % q)
pFinger = (2 * pFinger) + (int(pattern[j]) % q)
i = 0
while (i + m) < n:
if (f[i] == pFinger):
print "Match at position " + str(i)
f[i + 1] = (2 * (f[i] - (r * int(text[i])))) + (int(text[i + m]) % q)
i += 1
唯一的问题是,它似乎只匹配第一个或多个字符。
e.g。如果我打电话给搜索('01','101110001010101'),我就不会匹配。
或者如果我打电话给搜索('1','111110110100101')我会得到一个匹配。
或者,如果我调用搜索('0','0000001110001010101'),我会将匹配提升到第5位。
导致错误匹配的代码是否有问题?
答案 0 :(得分:0)
我不是天才,但我认为我找到了问题的根源。在线 r =(2 ^(m - 1))%q,据我所知,^不是创建指数函数的正确字符。在python中使用的正确字符是**,使得r =(2 **(m - 1))%q。您的搜索现在应打印除最后一个之外的所有位置。然后可以通过改变&lt;行中的n到&lt; = n(while(i + m)&lt; n:)
您的代码现在将打印所有位置,但您将收到索引错误,该错误仅在识别出所有位置后才会出现。这可以通过在错误发生时忽略此错误来解决。
尝试:
f[i + 1] = (2 * (f[i] - (r * int(text[i])))) + (int(text[i + m]) % q)
i += 1
除了:
break