Pythonが辞書を実装する方法を研究しています。Python 辞書実装の方程式の 1 つは、次の方程式を使用して、空の辞書スロットの疑似ランダム プローブを関連付けます。
j = ((j*5) + 1) % 2**i
ここで説明されています。
この質問を読みました。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)
その両方が小さなサイクルで立ち往生するのか.
方程式が機能するだけでなく、これをより直感的に理解できることを望んでおり、それが彼らがそれを使用した理由です。