Pythonアルゴリズムインタビュー:11章ハッシュ表


ハッシュ表


ハッシュ関数


任意のサイズデータを固定サイズ値にマッピングするための関数です.
ABC    -> A1
1324BC -> CB
AF32B  -> D5
  • 以上の入力値の長さはそれぞれ3,6,5であるが、矢印に対応するハッシュ関数によって固定サイズの2バイト値にマッピングされる.
  • ハッシュ関数の使用領域

  • 素子テーブル、チェックサム、損失圧縮、ランダム関数、暗号等
  • パフォーマンスの良いハッシュ関数の特性

  • ハッシュ関数数値衝突の超微細化
  • 単純快速演算
  • ハッシュリストにおけるハッシュ値の均一分布
  • ハッシュは、使用する鍵の全ての情報を利用する.
  • 高効率ハッシュテーブル
  • 誕生日の質問

  • 誕生日に同じ二人がいる確率で、23人が50%を超え、57人が99%を超える ハトの巣の原理
  • ふかけいすう


    ハッシュリストに格納されたデータ数nをbucket kで除算する
  • java 10は0.75、Pythonは0.5
  • クラスタ


    線形探査では、ハッシュ・リストのデータ・グループが随所に表示されます.
  • プローブ時間はO(n)O(n)O(n)ではありませんか?
  • ハッシュ表の競合の解決


    単一フィルタ

  • 競合時に接続リスト
  • に接続する.
  • データの増加に伴い、赤と黒のツリーに格納された形で並列に使用され、
  • オープン?ウエア

  • 衝突が発生した場合、検出によって空き空間を見つける方法:
  • 以上のフルスロット
  • を格納できません.
  • 競合が発生した場合は、
  • を検索して解決するために表領域内でプローブを行います.
  • 標準の負荷係数を超えると、別の大きなパケットが作成され、それに基づいて再コピーされます.
  • 動的アレイ内の空間が満たされている場合、二重ループにコピーするプロセスは
  • と同様である.

    Pythonでのハッシュテーブル競合の解決


    →オープン通信方式
  • スイッチはmallocを使用してメモリを割り当てるオーバーヘッドが高いため、オープンアドレス
  • を選択した.
  • 接続リストを作成するために追加のメモリ割当てを追加します.追加のメモリ割当てが比較的遅いため、
  • は選択されていません.
  • リニアプローブでは、負荷係数が高いほど平均クエリキャッシュ当たりの失敗率が高くなるという問題があるため、Pythonは負荷係数をJava(0.75)よりも小さいノイズ(0.66)
  • に設定する.