可能性のある複製:
Javaハッシュマップはどのように機能しますか?
JavaのHashSetがどのように機能するか、なぜArrayListsを使用するよりも高速であるかを誰かに説明してもらえますか?
HashSet
は実際にはHashMap
であり、値は常に同じです。
HashMap
の動作方法は、多くの場所で説明されています(「ハッシュテーブル」とも呼ばれます)。つまり、キー(オブジェクト)のハッシュを生成し、それらをテーブルに配置します。その後、キーを探すたびに、そのハッシュが計算され、テーブル内のバケットが直接参照されます。これは、マップにアクセスするための操作が1つ(ベストケース)しかないことを意味します。
HashSet
にはキーが含まれるだけなので、.contains(..)
はO(1)
になります。それとremove(..)
は、HashSet
がArrayList
(O(n))よりも高速な唯一の演算です。反復は同じですが、加算も同じです。
これらは2つの異なるデータ構造です。
HashSet
の背後にある概念は、重要な調査です。
つまり入力キーの変換を使用して、配列内の値の場所のインデックスを取得します。
配列はランダムアクセスを許可するため、これは定数O(1)
操作です。
Arraylistも配列によってサポートされているため、アクセスのためのO(1)
操作です。ただし、ランダムアクセスと挿入のみ。
searchは、配列リストのO(N)
操作ですが、HashSet
とは異なり、リストのすべての要素を検索して値を取得する必要があるため、キーを変換して配列にアクセスします。 HashSet
での検索はO(1)
です
実際のところ、たとえばArrayListに対してiterating overおよびappendingの方が高速です。
そして、一体、あなたはsort a HashSetさえできません。
しかし、最も速いのはNoOpです。 NoOpほど高速なものはありません。確かに、それはNoOpにはあまり効果がありません。しかし、それはそれで本当に速いです!
「よりも速い」と考えるものをより正確にする必要があります。