如何使用修改后的 Rabin-Karp 为字母分配数字以进行字谜搜索

Posted

技术标签:

【中文标题】如何使用修改后的 Rabin-Karp 为字母分配数字以进行字谜搜索【英文标题】:How to assign numbers to letters for anagram search using modified Rabin-Karp 【发布时间】:2021-03-12 17:44:06 【问题描述】:

我必须为字母 a、b、c、d...z 分配数字,这样对于给定的字符串和所有字谜搜索,我们可以使用散列搜索在 o(n) 中完成。散列函数应该是 s[0]+s[1]+s[2]..s[n-1]。 Anagram 与位置无关,因此不需要像 Rabin-Karp 那样乘以位置幂。

【问题讨论】:

到目前为止你尝试了什么? 我读过普通的 rabin karp 并且感觉使用像 3 5 7 11 13 17 19 31 这样的素数可能是关键,但我无法证明它是正确的。我写的小案子通过了,但这并不能证明它的真实性 【参考方案1】:

选择一些方便的素数模 p(可能是 231 - 1),然后将每个字母映射到 0 到 p-1 之间的随机数。可以证明,假设每个单词的每个字母少于p,则两个单词之间发生虚假碰撞的概率为1/p。

【讨论】:

如何显示先生?所以你是说从概率的角度来看,将素数或非素数整数分配给字母表没有影响? @MAG 对于介于 1 和 p-1 之间的任何数字 c,函数 f(x) = cx mod p 是对 0 和 p-1 之间的整数的一对一映射.给定两个不同的单词,它们至少有一个字母的计数不同,这意味着这个字母对哈希的贡献足以确保哈希的差异均匀分布在 0..p-1 中。

以上是关于如何使用修改后的 Rabin-Karp 为字母分配数字以进行字谜搜索的主要内容,如果未能解决你的问题,请参考以下文章

Rabin-Karp ACM训练

如何将用户输入的字符串转换为输入中单个字母的数组? [复制]

Rabin-Karp 字符串搜索算法

c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串

将字母分配给c中的int变量

Rabin-Karp 滚动哈希