我正在研究 python 如何实现字典。python字典实现中的一个等式与使用等式对空字典槽的伪随机探测有关
j = ((j*5) + 1) % 2**i
这是解释here。
我读过这个问题,Python 的内置字典是如何实现的?,并且基本了解字典是如何实现的。
我不明白的是为什么/如何等式:
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)
两者都卡在较小的周期中。
我希望能更直观地理解这一点,而不是等式有效,这就是他们使用它的原因。