【发布时间】:2016-09-19 14:51:05
【问题描述】:
我正在研究 python 如何实现字典。 python字典实现中的一个方程涉及使用方程对空字典槽的伪随机探测
j = ((j*5) + 1) % 2**i
解释here。
看了How are Python's Built In Dictionaries Implemented?这个问题,基本明白字典是怎么实现的了。
我不明白为什么/如何等式:
j = ((j*5) + 1) % 2**i
循环遍历2**i 的所有剩余部分。例如,如果 i = 3 的总起始大小为 8。j 经历了循环:
0
1
6
7
4
5
2
3
0
如果起始大小为16,则循环:
0 1 6 15 12 13 2 11 8 9 14 7 4 5 10 3 0
这对于探测字典中的所有槽非常有用。 但为什么它会起作用?为什么j = ((j*5)+1) 起作用,而j = ((j*6)+1) 或j = ((j*3)+1) 却不起作用,它们都陷入了较小的周期。
我希望对此有更直观的理解,而不是 等式有效,这就是他们使用它的原因。
【问题讨论】:
-
因为 5 与 2^i 互质,所以LCM 是 5 * 2^i。
-
引用上面几行:“请参阅有关随机数生成的任何文本以获取证据”:)
-
@OliverCharlesworth 通过该论点,那么 (j*3)+1 也应该有效。
-
Knuth 的“计算机编程的艺术:第 2 卷”对类似问题进行了广泛的处理,您可能会觉得有帮助。
-
这只是一个无关紧要的 Python 问题,一个字典问题,甚至是一个编程问题。
标签: python algorithm dictionary linear-probing