[解決済み] HashMapのget/putの複雑さ
質問
私たちは、よく次のように言います。
HashMap
get/put
の演算はO(1)です。しかし、それはハッシュの実装に依存する。デフォルトのオブジェクトハッシュは、実際にはJVMヒープ内の内部アドレスである。と主張するのは良いのだろうか?
get/put
はO(1)なのでしょうか?
利用可能なメモリも問題です。javadocsから理解しているように
HashMap
ロードファクターは0.75であるべきです。もし、JVMに十分なメモリがなく、ロードファクターが制限を超えたらどうなりますか?
ということは、O(1)は保証されないようですね。それとも何か見落としているのでしょうか?
どのように解決するのですか?
それは多くのことに依存します。それは
通常
まともなハッシュならO(1)で、それ自体は一定時間ですが、計算に長い時間がかかるハッシュもありえます。
そして
ハッシュマップの中に同じハッシュコードを返す項目が複数ある場合。
get
を呼び出すと、それらを繰り返し実行する必要があります。
equals
をそれぞれ使って、一致するものを探します。
最悪の場合
HashMap
は、同じハッシュバケツ内のすべてのエントリを走査するため(たとえば、それらがすべて同じハッシュコードを持つ場合)、O(n)のルックアップが発生します。幸いなことに、私の経験では、そのような最悪のシナリオは現実にはあまり出てきません。しかし、どのアルゴリズムやデータ構造を使うかを検討する際には、通常、O(1)を仮定すべきなのです。
JDK8では
HashMap
が調整され、キーが順序を比較できる場合、密に配置されたバケツはツリーとして実装され、同じハッシュコードのエントリーがたくさんあったとしても、その複雑さは O(log n) となります。もちろん、等値性と順序性が異なるキータイプがある場合には、問題が発生する可能性があります。
そうそう、ハッシュマップに十分なメモリがないと大変なことになるけど、これはどんなデータ構造を使っても同じことだね。
関連
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
-
[解決済み】アルゴリズムの時間複雑性を求めるには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
Dateが型に解決できない問題を解決する
-
プロローグでのコンテンツは禁止されています
-
プロジェクトの依存関係を解決できなかった 解決
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
[解決済み] Java Hashmap。値からキーを取得する方法は?