[解決済み] ハッシュのランダム化を有効にすると、なぜ tuple(set([1, "a", "b", "c", "z", "f"]) == tuple(set(["a", "b", "c", "z", "f",1])) 85% of times なのですか?
質問
別の質問に対するジブン・ゼロ・ピレアスの回答 ということになります。
x = tuple(set([1, "a", "b", "c", "z", "f"]))
y = tuple(set(["a", "b", "c", "z", "f", 1]))
print(x == y)
プリント
True
で約85%の確率で
ハッシュランダム化
を有効にしています。なぜ 85% なのか?
どのように解決するのですか?
この質問を読んでいる人は、両方を読んでいると仮定します。
まず注意すべきは、ハッシュのランダム化はインタプリタ起動時に決定されることです。
各文字のハッシュは両方のセットで同じになるので、問題になり得るのは衝突があった場合だけです(ここで順番が影響されます)。
2 番目のリンクの推論により、これらのセットのバック配列は長さ 8 で開始することがわかります。
_ _ _ _ _ _ _ _
最初のケースでは
1
:
_ 1 _ _ _ _ _ _
と入力し、残りを挿入します。
α 1 ? ? ? ? ? ?
その後、サイズ32にリハッシュされます。
1 can't collide with α as α is an even hash
↓ so 1 is inserted at slot 1 first
? 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
の場合、残りを挿入します。
? β ? ? ? ? ? ?
そして、1を挿入してみる。
Try to insert 1 here, but will
↓ be rehashed if β exists
? β ? ? ? ? ? ?
そして、蒸し返される。
Try to insert 1 here, but will
be rehashed if β exists and has
↓ not rehashed somewhere else
? β ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
つまり、反復の順序が異なるかどうかは、βが存在するかどうかだけに依存します。
βが存在する確率は、5つの文字のどれかが8モジュールの1にハッシュ化する確率です。 と は1モジュロ32にハッシュします。
1 modulo 32 にハッシュするものはすべて 1 modulo 8 にもハッシュするので、32 個のスロットのうち、5 つのうちの 1 つがスロット 1 にある確率を見つけたいのです。
5 (number of letters) / 32 (number of slots)
5/32は0.15625なので 2つのセット構成の間で順序が異なる確率は15.625%¹である。 .
まったく不思議なことに、これはまさにゼロ・ピレウスが測定したものです。
技術的には、これさえも明らかではありません。5 つのハッシュのすべてがリハッシュのために一意であるように装うことができますが、線形プロービングのため、実際には "束ねられた構造が発生しやすくなります...しかし、単一のスロットが占有されているかどうかにのみ注目しているので、これは実際には影響を与えません。
関連
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] 億の相対的輸入
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み] PythonとCpythonの比較
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜ、辞書や集合の順番は任意なのか?
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] if 節の終了方法