我正在自学麻省理工学院的算法导论。有一个背诵视频深入介绍了抽象数据类型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应该尽可能接近字大小是什么意思?
我希望这可以帮助那些在将来尝试自学这门课程的人。
答案 0 :(得分:2)
两者之间并没有任何关系。根据输入的大小选择基数,并选择素数以使其足够大以使误报的可能性很小,但小到足以方便/快速地进行计算。
你确实需要确保它们是互质的(因为p
是一个素数,这意味着它不应该是基数的一个因素)。如果p
大于基数,则可以保证这一点,因此不应该是一个问题。
P应该尽可能接近字大小是什么意思?
单词大小是&#34;自然&#34;可以快速执行计算的体系结构的大小。例如,在32位机器上,字大小为32位,因此您经常希望将散列存储在32位无符号整数中,并使用接近2 32 <的素数 in value,以便哈希值覆盖大多数可能的32位值。