【问题标题】:Python: Monte Carlo Rabin-Karp searchPython:蒙特卡洛拉宾-卡普搜索
【发布时间】:2015-10-15 07:08:32
【问题描述】:

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

唯一的问题是,它似乎只匹配第一个或多个字符。

例如如果我调用 search('01', '101110001010101'),我找不到匹配项。

或者如果我调用 search('1', '111110110100101') 我会得到一个匹配项。

或者如果我调用 search('0', '0000001110001010101') 我会得到匹配到位置 5。

导致匹配不正确的代码是否有问题?

【问题讨论】:

  • 可以为你调试这个,但对你帮助不大。尝试将打印输出添加到您的代码中。例如,在每次迭代中,打印出什么是指纹。

标签: python search


【解决方案1】:

我不是天才,但我想我找到了问题的根源。在行 r = (2^(m - 1)) % q ,据我所知, ^ 不是创建指数函数的正确字符。在 python 中使用的正确字符是 ** 这样 r = (2**(m - 1)) % q。您的搜索现在应该打印除最后一个位置之外的所有位置。然后可以通过将行中的

您的代码现在将打印所有头寸,尽管您会收到一个索引错误,该错误仅在识别所有头寸后才会出现。一旦发生此错误,可以通过忽略此错误来解决。

尝试:

   f[i + 1] = (2 * (f[i] - (r * int(text[i])))) + (int(text[i + m]) % q)

   i += 1

除了:

   break

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 2020-04-09
    • 2012-02-21
    • 2021-01-06
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2014-03-26
    相关资源
    最近更新 更多