在滚动哈希中,哈希函数的除法方法中使用的素数与为数字选择的基数之间的关系是什么?

时间:2016-04-02 21:38:42

标签: algorithm hash

我正在自学麻省理工学院的算法导论。有一个背诵视频深入介绍了抽象数据类型Rolling Hash。这是该视频的注释的链接(第一页是关于Rolling Hash):Recitation 9 Notes

视频中使用的示例是尝试在大小为n的较大字符串中搜索大小为k的字符串(如在文档中搜索单词)。滚动哈希可以使此任务在O(n)中运行。

这个想法是你有一个大小为k的窗口,它从较大字符串的开头开始。在每个步骤中,您在窗口中对字符串进行哈希处理,并将其与您要搜索的字符串的哈希值进行比较。如果哈希值不匹配,那么您还没有找到要搜索的字符串,因此您向前滚动一个字符,然后重试。

为了说明其工作原理,有必要将各个字符串字符视为基数b的整数(其中此基数可以是任何值,但可能是可能的字符数,例如ASCII为256)。字符串成为整数列表。当您向前“滚动”搜索窗口时,使用名为“append”和“skip”(或“pop”)的滚动哈希操作:消除(跳过或弹出)列表中的第一个整数,并追加下一个整数在列表中的文档中。该视频深入探讨了如何从一个窗口的哈希到O(1)中的下一个窗口的哈希,但所使用的哈希函数只是简单的模数函数(在上面的链接注释中可以很容易地看到)。

有一个观众问题,以我无法理解的方式回答:

  

观众:p(模数函数中使用的素数)   总是必须少于基数,或者它可以是什么?

     

教授:它可能比基数大。所以,如果我想没有   很多误报,然后假设我的基数是256,因为那是一个   额外的性格。我之前争论的是假的数量   我的积极因素基本上是1 / P.所以我希望p尽可能接近   字大小尽可能。所以p将在2到40亿左右。所以   绝对更大。它可以以任何方式工作。如果它更大,那就更好了   对于我们在那里使用的算法。

首先,如果在简单散列函数的模数函数中使用素数p,那么碰撞的概率(假设简单的均匀散列)是1 / P,对吗?说P应该尽可能接近字大小是什么意思?

我希望这可以帮助那些在将来尝试自学这门课程的人。

1 个答案:

答案 0 :(得分:2)

两者之间并没有任何关系。根据输入的大小选择基数,并选择素数以使其足够大以使误报的可能性很小,但小到足以方便/快速地进行计算。

你确实需要确保它们是互质的(因为p是一个素数,这意味着它不应该是基数的一个因素)。如果p大于基数,则可以保证这一点,因此不应该是一个问题。

  

P应该尽可能接近字大小是什么意思?

单词大小是&#34;自然&#34;可以快速执行计算的体系结构的大小。例如,在32位机器上,字大小为32位,因此您经常希望将散列存储在32位无符号整数中,并使用接近2 32 <的素数 in value,以便哈希值覆盖大多数可能的32位值。