- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在尝试理解算法类的 Rabin-Karp 算法。我在理解它时遇到了很多麻烦,所以我尝试实现它(我实际上不必实现它)。我想我正确地理解了滚动哈希函数以外的所有内容。我的算法目前只适用于模式 char[] 在文本 char[] 开头匹配的情况。我不知道我的滚动哈希哪里出了问题。如果有人可以指出错误的方向,我将非常感激。
结果文本“我的测试字符串”模式“我的” - 这回来匹配模式“测试”- 这显示不匹配
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;
}
最佳答案
您的代码中存在几个基本问题。
第一个在这里:patternHash += int_mod(patternHash * base + pattern[i], primeMod);
它在其他几个地方重复。
第二个是计算划船哈希:
segmentHash += int_mod(segmentHash * base + text[i + pattern.length -1],primeMod);
segmentHash -= int_mod(segmentHash * base + text[i-1], primeMod);
这两个错误都可以轻松修复。但是,我会建议您更好地理解代码背后的逻辑,而不是仅仅从某个地方复制它。您使用的散列算法是基于多项式的,因此请尝试查看该级别上发生的情况。甚至可以手写一些示例——它们在调试代码时会很有用。
另请注意,您将遇到整数溢出问题:
- int 可以存储高达 20 亿的数字;
- 你的 prime 模块大约有 10 亿,所以哈希值(特别是 patternHash
和 segmentHash
)可以达到这个数字;
- 你的基础是 int base = 257;
因此,表达式 segmentHash * base
可以达到 ~2570 亿,这肯定是整数溢出。
关于java - Rabin-Karp算法Java的滚动哈希算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18604247/
我从这个网站理解了 Rabin-Karp 算法:https://www.geeksforgeeks.org/rabin-karp-algorithm-for-pattern-searching/ 他们
在 Coursera 视频之一中,Rabin-Karp 滚动哈希 (http://en.wikipedia.org/wiki/Rolling_hash) 显示为: public static long
我的 previous question属于通用字符串搜索算法。我正在研究 Rabin-Karp 算法,我有一个函数模板,例如: RabinKarpMatch(char *Text, char *Se
我在实现 Karp-Rabin 的简单版本时遇到问题模式行进者;我没有得到预期的结果。这是我的例子; string='today is a good day' sub='good' 我想在上面的字符串
我正在阅读 Cormen 等人的《算法导论》中有关字符串算法的内容 以下是关于一些初等数论符号的文本。 注意:在下文中将 == 称为模等价。 给定一个整数除以另一个整数的余数的定义明确的概念,提供特殊
我正在尝试更详细地了解 Edmonds-Karp 算法,并且很想知道它使用什么算法计算每次迭代中从 s 到 t 的最短路径(最少边数) 最佳答案 广度优先搜索。您可能想阅读 Wikipedia ent
Hopcroft–Karp 算法求二部图中最大基数匹配的论文最后两段: https://dl.dropboxusercontent.com/u/64823035/04569670.pdf The ex
rolling hash Rabin-Karp算法中hashcode值过大如何处理?我使用模运算来避免负数,但是当哈希码超过我的模数(N = 83559671)时会出现问题。我将我的基数设置为素数(计
谁能给我 karmarkar-karp 差分算法的伪代码,我不明白。如果有它的可视化/演示就更好了。 最佳答案 它也以降序排列数字开始。 这里是列表[8,7,6,5,4]的排序结果 在每一步,算法都会
我目前正在进行一个项目,以图形方式解释 Hopcroft-Karp 算法。 我正在使用 Wikipedia article 中的伪代码. 我还在 Stack Overflow 上看到了这个算法的实现
我正在为 Rabin-Karp 算法寻找高效的哈希函数。这是我的实际代码(C 编程语言)。 static bool f2(char const *const s1, size_t const n1,
我一直在使用 C++ 编写 Rabin-Karp 字符串匹配函数,但没有得到任何结果。我感觉我没有正确计算某些值,但我不知道是哪一个。 原型(prototype) void rabinKarp(str
我有兴趣实现 Rabin-Karp 算法来搜索 wiki 上所述的子字符串:http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorith
我希望使用滚动哈希函数,这样我就可以对非常大的字符串的 n-gram 进行哈希处理。 例如: “stackoverflow”,分成 5 克将是: "stack", "tacko", "ackov",
我正在尝试实现用于查找子字符串的 Rabin-Karp;我卡在了滚动哈希(尝试使用 formula suggested in Wikipedia )。 #define MOD 1000000007 u
我正在使用 Rabin–Karp 算法来检查任意两个源代码文件是否存在抄袭所以首先我简单地在 c# 中实现它的算法,这里是它的代码,但它的平均和最佳情况下的运行时间是 O(n+m) 在空间 O(p)
我正在尝试实现 Karmarkar-Karp 启发式数字分区算法的 k 分区版本。但我正在为它的第二阶段而苦苦挣扎,其中数字分区是根据所得的差异集重建的。 我能找到的唯一用一些伪代码彻底描述第二阶段的
所以我正在解决 this问题(Rabin Karp 的算法)并编写了以下解决方案: private static void searchPattern(String text, String patt
我正在尝试制作 HopcroftKarpBipartiteMatching,但没有演示,或者我找不到其他任何东西来帮助我使用该库。我无法从文档中弄清楚实例化 HopcroftKarpBipartite
对于这个可能重复的问题,我们深表歉意。 我正在尝试将滚动散列与 Karp Rabin 一起使用。我查看了滚动散列的不同实现,我想知道我哪里出错了。尽管文本具有模式,但使用哈希的匹配似乎根本没有发生。附
我是一名优秀的程序员,十分优秀!