问题标签 [rabin-karp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4832 浏览

string-search - Rabin Karp 什么时候比 KMP 或 Boyer-Moore 更有效?

我正在学习字符串搜索算法并了解它们的工作原理,但还没有找到足够好的答案来说明在哪些情况下 Rabin-Karp 算法会比 KMP 或 Boyer-Moore 更有效。我看到它更容易实现并且不需要相同的开销,但除此之外,我不知道。

那么,Rabin-Karp 什么时候比其他方法更好用呢?

0 投票
1 回答
257 浏览

algorithm - 为什么我们需要在 Rabin Karp 算法中每次哈希值相同时检查模式匹配

我不明白为什么我们需要在每次哈希为模式和文本返回相同值时检查子字符串匹配的原因。对于字符串,返回的哈希值不是唯一的吗?

0 投票
0 回答
39 浏览

c++ - Robin carp 实施没有给出预期的结果

使用 1000000007 进行散列后,以下代码未提供所需的输出。

使用 101 进行散列可以使其正常工作。你能帮我找出我出错的地方吗?

没有显示输入案例的输出:deeeeeeeeeeeeeeeeeee 和 eeeeeeeeeeee。

0 投票
1 回答
528 浏览

algorithm - C++ 奇怪的结果 - 蛮力比 Rabin-Karp 更快......?

目前正在为一个 uni 模块开发一个字符串搜索程序,并且我已经成功地实现了这些算法,至少到了他们一致地找到字符串的程度。我实现了 Boyer Moore 和 Rabin Karp。当我的一个同学遇到这个确切的问题时,我也投入了蛮力,并意识到我遇到了同样的问题 - 蛮力比单词列表上的 Rabin-Karp 更快。

Rabin-Karp 似乎花费了最多的时间来执行滚动哈希,一开始我很好奇我是否只是有很多碰撞,但我设法用一个巨大的素数将碰撞降低到 3。由于质数的大小,我假设这增加了一点时间,但滚动哈希似乎很明显导致了问题。

这是滚动哈希部分:

我想尝试搜索一个巨大的文本文件,所以我使用了 Rockyou 词汇表,Boyer Moore 对此非常满意,而 Rabin-Karp 只需不到一秒钟的时间。蛮力花费的时间不到 Rabin-Karp 的一半,尽管这对我来说没有意义?

我是否误解了应该如何应用这些算法,或者我正在使用的滚动哈希过程是否存在问题?

0 投票
3 回答
568 浏览

c - O(n) 子串算法

所以我一直在研究子字符串搜索算法,发现大多数算法(如 kmp 和 rabin-karp 算法)在进行一些字符串匹配之前需要额外的时间复杂度来预处理时间。这样做有什么好处吗?为什么他们不直接跳到字符串匹配,以使大 O 时间复杂度不会下降到 O(m+n)?我尝试通过简单地跳过预处理时间来创建一个我认为是 O(n) 的子字符串算法(如果我错了,请纠正我)。我想知道为什么人们不这样做,请参阅下面的 C 代码。

编辑:

删除了 strlen 函数以避免任何不必要的时间复杂度

0 投票
1 回答
41 浏览

java - 为什么会为相同的子字符串生成两个不同的哈希值,我能做些什么来解决这个问题?

我编写了以下代码来尝试 Rabin-Karp 算法的简单实现。

像上面的代码一样计算滚动哈希在纸上效果很好,但我无法弄清楚为什么rollHash /= prime;没有产生完美的划分。

希望提供更多上下文的示例输入/输出。输入

输出

我希望Perfect division anticipated 107.9727626459144这条线输出 108,rolling hash: 27863然后滚动哈希为 27864。

0 投票
1 回答
634 浏览

c++ - C26451:在 4 字节值上使用运算符“+”进行算术溢出,然后将结果转换为 8 字节值

我正在尝试编写一个程序,该程序使用两种不同的字符串搜索算法搜索电影脚本。但是警告C26451:在 4 字节值上使用运算符“+”然后将结果转换为 8 字节值的算术溢出继续出现在 rabin karp 的计算哈希部分中,是否有解决此问题的方法?任何帮助将不胜感激。

错误的上下文

0 投票
1 回答
337 浏览

java - Rabin Karp 算法运行速度比 naive 慢

我实现了 Rabin-Karp 算法,但它的运行速度比简单的字符串搜索要慢(这不是为了分配,我只是为了更好地理解它而对其进行编码)。

Rabin Karp(我使用 128 作为 ascii 的基础):

朴素算法:

测试(主要):

结果是运行 Rabin-Karp 算法需要 2517 毫秒,而运行朴素算法只需要 675 毫秒。我怀疑这updateHoner()需要很长时间,但我不确定。任何见解将不胜感激。

谢谢

编辑:拼写错误

0 投票
1 回答
222 浏览

algorithm - Go:用于字符串比较的多项式指纹

我想实现一个滚动哈希函数来进行字符串比较(Rabin-Karp)

为此,我将输入字符串转换为字节切片(使用 go unicode/utf8)并在其上运行“多项式指纹”功能。

例如,我输入qwerty转换为[113 119 101 114 116 121] 我使用基数的字符串256

我对“多项式指纹”的概念有疑问:很快,基础变得非常大,如何随着用户想要匹配的字符串输入进行扩展?

在我的用例中,因为 Gomath.Pow函数使用 float64 类型,所以在 7 个字符后它会变得混乱

我觉得使用 uint64 只会使问题向前一点

0 投票
2 回答
94 浏览

algorithm - 如果我们忽略模部分并让 hash int/long 溢出,rabin-karp 字符串搜索算法是否仍然正确?

我有一个问题:如果我们让滚动哈希溢出,是否会影响 Rabin-Karp 算法的正确性?您能否举一个可靠的例子说明溢出确实会影响正确性?

这类似于相同的字符串,例如,当您直接从“abcd”或“eabcd”计算时,“abcd”将给出不同的哈希值 (hash("eabc") - hash("e") * R^3) * R +哈希(“d”)

hash("abcd") != (hash("eabc") - hash("e") * R^3) * R + hash("d") 如果我们允许 int/long 溢出