- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有兴趣实现 Rabin-Karp 算法来搜索 wiki 上所述的子字符串:http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorithm .不是为了功课,而是为了自己的利益。我已经实现了 Rabin-Karp 算法(如下所示)并且它有效。但是,性能真的非常差!!!我知道我的哈希函数是基本的。然而,似乎对 strstr() 的简单调用总是优于我的函数 rabin_karp()。我能理解为什么 - 散列函数比简单的逐个字符比较每个循环做的工作更多。我在这里错过了什么? Rabin-Karp 算法是否应该比调用 strstr() 更快?什么时候最好使用 Rabin-Karp 算法?因此,我的私利。我是否正确实现了算法?
size_t hash(char* str, size_t i)
{
size_t h = 0;
size_t magic_exp = 1;
// if (str != NULL)
{
while (i-- != 0)
{
magic_exp *= 101;
h += magic_exp + *str;
++str;
}
}
return h;
}
char* rabin_karp(char* s, char* find)
{
char* p = NULL;
if (s != NULL && find != NULL)
{
size_t n = strlen(s);
size_t m = strlen(find);
if (n > m)
{
size_t hfind = hash(find, m);
char* end = s + (n - m + 1);
for (char* i = s; i < end; ++i)
{
size_t hs = hash(i, m);
if (hs == hfind)
{
if (strncmp(i, find, m) == 0)
{
p = i;
break;
}
}
}
}
}
return p;
}
最佳答案
您没有正确实现散列。 Rabin-Karp 的关键是随着潜在匹配沿着要搜索的字符串移动,增量更新散列。正如您所确定的那样,如果您为每个可能的匹配位置重新计算整个哈希值,事情将会非常缓慢。
对于除第一次比较之外的每种情况,您的哈希函数都应采用现有哈希、一个新字符和一个旧字符,并返回更新后的哈希。
关于c++ - Rabin-Karp 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256913/
我正在尝试实现 Rabin Karp 算法的一些修改版本。我的想法是,如果我根据与每个字母相关的权重得到给定模式的哈希值,那么我就不必担心字谜,这样我就可以只选择字符串的一部分,计算它的哈希值并进行比
在 rabin 算法中取模如何帮助降低本地 horners 规则字符串匹配的复杂性。请任何人解释 最佳答案 我猜按照 Horners 规则,你的意思是将字符串视为某个基数中的数字 ("abcd"= '
我一直在尝试理解算法类的 Rabin-Karp 算法。我在理解它时遇到了很多麻烦,所以我尝试实现它(我实际上不必实现它)。我想我正确地理解了滚动哈希函数以外的所有内容。我的算法目前只适用于模式 cha
我有一个关于选择 q 和 d 的问题 in Rabin-Karp algorithm用于搜索字符串。该算法使用值 q 作为模数,使用 d 作为哈希函数。 如果我选择 q 作为 2 的幂并且 d=q-1
我在网站的论坛上看到过这个 Rabin Karp 字符串匹配算法,我有兴趣尝试实现它,但我想知道是否有人能告诉我为什么变量 ulong Q 和 ulong D 是 100007 和 256分别:S?这
我实现 Rabin-Karp 算法只是为了好玩。我遇到了这个伪代码: RABIN -KARP -MATCHER (T, P, d, q) 1 n = T.length 2 m
我正在实现 Wikipedia's Miller-Rabin algorithm但似乎没有得到甚至模糊恰当的结果。 7, 11, 19, 23 等被报道为复合 Material 。事实上,当 k>12
我从这个网站理解了 Rabin-Karp 算法:https://www.geeksforgeeks.org/rabin-karp-algorithm-for-pattern-searching/ 他们
我很清楚单个 Miller-Rabin 测试以三次对数时间运行。我知道蒙哥马利模幂和 GNFS 并且我不会问任何那些奇特的理论。我想知道的是,在特征硬件(例如,2.2 GHz Opteron 或某某显
我正在尝试制作 RSA 算法。为此,我需要 rabin-miller+witness+modular exponentiation(至少我需要使用它)。当我生成随机数以检查 rabin miller
在 Coursera 视频之一中,Rabin-Karp 滚动哈希 (http://en.wikipedia.org/wiki/Rolling_hash) 显示为: public static long
我的 previous question属于通用字符串搜索算法。我正在研究 Rabin-Karp 算法,我有一个函数模板,例如: RabinKarpMatch(char *Text, char *Se
我有 Miller-Rabin 实现 def MillerRabin(n,a): e = 0 q = n-1 while q % 2 == 0: e +=
我在实现 Karp-Rabin 的简单版本时遇到问题模式行进者;我没有得到预期的结果。这是我的例子; string='today is a good day' sub='good' 我想在上面的字符串
我正在阅读 Cormen 等人的《算法导论》中有关字符串算法的内容 以下是关于一些初等数论符号的文本。 注意:在下文中将 == 称为模等价。 给定一个整数除以另一个整数的余数的定义明确的概念,提供特殊
rolling hash Rabin-Karp算法中hashcode值过大如何处理?我使用模运算来避免负数,但是当哈希码超过我的模数(N = 83559671)时会出现问题。我将我的基数设置为素数(计
我正在为 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",
我是一名优秀的程序员,十分优秀!