[解決済み] ハッシュテーブルは本当にO(1)になるのか?
質問
ハッシュテーブルがO(1)を達成できることは常識のようですが、私には意味が分かりませんでした。 どなたか説明していただけませんか。以下は、思い浮かぶ 2 つの状況です。
A. 値がハッシュテーブルのサイズより小さいintである。 したがって、値はそれ自身のハッシュなので、ハッシュテーブルは存在しない。しかし、もしあったとしてもO(1)となり、やはり非効率的です。
B. 値のハッシュを計算する必要がある。 この状況では、ルックアップされるデータのサイズに対してO(n)のオーダーになります。 O(n)の作業をした後のルックアップはO(1)になるかもしれませんが、それでも私の目にはO(n)に映ります。
また、完全なハッシュや大きなハッシュテーブルがない限り、バケットごとに数個のアイテムがあることでしょう。ですから、いずれにせよ、ある時点で小さな線形探索に発展してしまいます。
ハッシュテーブルはすごいと思うが、理論的なものでなければO(1)の指定はないだろう。
ウィキペディアの の記事で、ハッシュテーブルについて は一貫して一定のルックアップ時間を参照し、ハッシュ関数のコストを完全に無視しています。 これは本当に公正な測定なのでしょうか?
編集します。 私が学んだことをまとめると
-
ハッシュ関数がキーのすべての情報を使用する必要がないため定数時間になりうること、また、十分に大きなテーブルでは衝突を定数時間近くまで下げることができるため、技術的には正しい。
-
ハッシュ関数とテーブルのサイズが衝突を最小化するように選択される限り、たとえそれがしばしば定時間ハッシュ関数を使用しないことを意味するとしても、時間とともにうまくいくので、実際には真実です。
どのように解決するのですか?
ここではmとnという2つの変数があり、mは入力の長さ、nはハッシュの項目数です。
O(1) ルックアップ パフォーマンスの主張には、少なくとも 2 つの前提があります。
- オブジェクトは O(1) 時間で等価比較できる。
- ハッシュの衝突はほとんど起こりません。
オブジェクトのサイズが可変で、等価性チェックにすべてのビットを見る必要がある場合、パフォーマンスは O(m) になります。しかし、ハッシュ関数は O(m) である必要はなく、O(1) であってもかまいません。暗号ハッシュとは異なり、辞書で使用するハッシュ関数は、ハッシュを計算するために入力のすべてのビットを見る必要がない。実装では、固定数のビットだけを自由に見ることができます。
十分に多くのアイテムについて、アイテムの数は可能なハッシュの数よりも大きくなり、そして、O(1)を超えるパフォーマンスを引き起こす衝突が発生し、たとえば、単純なリンクリストトラバーサルについてはO(n) (または両方の仮定が誤っている場合はO(n*m))となります。
しかし実際には、技術的には間違っていますが、O(1) の主張は およそ であり、特に上記の前提が成立する状況においては真であると言えます。
関連
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[終了しました]
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] O(log n)とは具体的にどのような意味ですか?
-
[解決済み] Bashでハッシュテーブルを定義する方法は?
-
[解決済み] Big-O for PHP関数一覧
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] 良いハッシュ関数とは?
-
[解決済み] キャッシュの無効化 - 一般的な解決策はありますか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】決定木(比較ソートアルゴリズム)の葉の最短の深さ)
-
[解決済み] ポイントルック アット ポイント
-
[解決済み] 素朴な」アルゴリズムとは何か、「閉じた」解とは何か?
-
[解決済み] 決定論的クイックソートとは何ですか?
-
[解決済み] T = {<M> | Mはwを受け入れるときはいつでも$w^R$を受け入れるTMである}とする。Tが決定不可能であることを示せ
-
[解決済み] C++ std::map に指定されたキーが存在するかどうかを調べる方法
-
[解決済み] [Solved] .Net データ構造。ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary -- 速度、メモリ、そしてそれぞれを使うべきタイミングは?[クローズド]。
-
[解決済み] HashMapのget/putの複雑さ
-
[解決済み] クロスワードを生成するアルゴリズム[クローズド]について
-
[解決済み] ブルームフィルターを使用するメリットは何ですか?