Python:Monte Carlo Rabin-Karp搜索

时间:2015-10-15 07:08:33

标签: python search

我正在尝试用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位。

导致错误匹配的代码是否有问题?

1 个答案:

答案 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