Karp Rabin算法

时间:2015-09-18 20:28:51

标签: python algorithm rabin-karp

我正在实现karp-rabin子串匹配算法。当我在子串上调用hash_string()方法时,我的实现工作正常但在实现滚动哈希时失败。我的滚动哈希值不断增长,我无法弄清楚原因。

def hash_string(string, base):
    power = len(string) - 1
    hash_value = 0
    for i in range(power, -1, -1):
        hash_value += (ord(string[i]) * (base ** power))
    return hash_value

def karp_rabin(string, substring):
    substrhash = hash_string(substring, 256)
    rolling_hash_val = hash_string(string[0:len(substring)], 256)
    for i in range(len(string) - len(substring) + 1):
        if substrhash == rolling_hash_val and string[i:i+len(substring)] == substring:
            return i
        if i < len(string) - len(substring):
            print rolling_hash_val
            print (ord(string[i]) * (256 ** (len(substring) - 1))) * 256
            rolling_hash_val = (rolling_hash_val - (ord(string[i]) * (256 ** (len(substring) - 1)))) * 256 + ord(string[i + len(substring)])

print karp_rabin('ababababaababab', 'aab')

更具体地说,问题出现在这里:

rolling_hash_val = (rolling_hash_val - (ord(string[i]) * (256 ** (len(substring) - 1)))) * 256 + ord(string[i + len(substring)])

即使子字符串长度保持不变,滚动哈希值也会增加几个数量级。这个滚动哈希实现是否正确?

1 个答案:

答案 0 :(得分:0)

滚动哈希通常以模运算方式完成。我的意思是,那里有各种各样的加法和乘法和取幂 - 如果它不是模n(对于某些 Process p = null; Runtime rt = Runtime.getRuntime (); String rutaFinal=path+carpeta+"/"; System.out.println("** Executing command *****"); p = rt.exec("chmod x process.sh"); p = rt.exec ("sh process.sh"); p.waitFor(); ),是的,事情会增长。

(顺便说一下,不要试图只进行散列更新,然后进行模数。对于正常大小的整数,这不是一个好主意。使用实际的模幂运算。)