首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rabin-Karp算法Java的滚动哈希算法

Rabin-Karp算法Java的滚动哈希算法
EN

Stack Overflow用户
提问于 2013-09-04 01:53:29
回答 1查看 2.9K关注 0票数 2

我一直试图理解一个算法类的Rabin算法.我很难理解它,所以我尝试实现它(我实际上不需要实现它)。我想除了滚动哈希函数之外,我什么都能理解。目前,我的算法只在模式char[]匹配文本char[]的开头时才有效。我不知道我的滚动散列哪里出了问题。如果有人能帮我指出错误的方向,我会非常高兴的。

结果文本“我的测试字符串”模式"my“--它返回为匹配模式" test”--这显示不匹配。

代码语言:javascript
复制
private static int int_mod(int a, int b)
{
    return (a%b +b)%b;
}

public static int rabin_Karp(char[] text, char[] pattern)
{
    int textSize = text.length;
    int patternSize = pattern.length;
    int base = 257;
    int primeMod = 1000000007;

    if(textSize < patternSize) 
    return -1;n
    int patternHash = 0;
    for(int i = 0; i < patternSize; i++) 
        patternHash += int_mod(patternHash * base + pattern[i], primeMod);//This is only done once so put method here           
        System.out.println("patternHash: " + patternHash);
    //calculate the value of the first hash
    int segmentHash = 0;
    for(int i = 0; i < patternSize; i++) //remove this, this will be duplicate
        segmentHash += int_mod(segmentHash * base + text[i], primeMod);
        System.out.println("segmentHash: " + segmentHash);

    Boolean firstMatch = false;
    if(segmentHash == patternHash) 
    {
        firstMatch = true;
        for(int i=0; i<pattern.length; i++)
        {
            if(pattern[i] != text[i])
            firstMatch = false;
        }
    }
    if (firstMatch == true)
    {
        return 0;
    }

    for(int i=1; i<textSize - patternSize; i++)
    {
        segmentHash += int_mod(segmentHash * base + text[i + pattern.length -1],primeMod);
        segmentHash -= int_mod(segmentHash * base + text[i-1], primeMod);
        System.out.println("segmentHash: " + segmentHash);

        if(segmentHash == patternHash) 
        {
            firstMatch = true;
            for(int j=0; j<pattern.length; j++)
            {
                if(pattern[j] != text[j])
                    firstMatch = false;
            }
        }
        if (firstMatch == true)
        {
            return i;
        }
    }

    return -1;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-04 05:04:27

您的代码中有几个基本问题。

第一个是在这里:patternHash += int_mod(patternHash * base + pattern[i], primeMod);,它在更多的地方复制。

第二种方法是计算划船散列:

代码语言:javascript
复制
    segmentHash += int_mod(segmentHash * base + text[i + pattern.length -1],primeMod);
    segmentHash -= int_mod(segmentHash * base + text[i-1], primeMod);

这两个错误都可以很容易地修复。但是,我建议您更好地理解代码背后的逻辑,而不是仅仅从某个地方复制代码。您所使用的散列算法是基于多项式的,因此尝试查看在该级别上发生了什么。甚至可以手工编写一些示例--它们在调试代码时将非常有用。

还请注意,您将遇到整数溢出的问题:

  • int可以存储高达20亿美元的数字;
  • 你的主要模块是10亿,所以散列(特别是patternHashsegmentHash )可以达到这个数字;
  • 你的基地是int base = 257;

因此,表达式segmentHash * base可以高达2570亿,这肯定是一个整数溢出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18604247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档