web-dev-qa-db-ja.com

Javaのcontains()の最速のデータ構造?

Contains()の操作が最も速いJavaのデータ構造は何ですか?

例えば一連の番号{1、7、12、14、20 ...}があります

別の任意の数xが与えられた場合、xがセットに含まれるかどうかのブール値を生成する(平均して)最速の方法は何ですか? !contains()の確率は約5倍高くなります。

すべてのマップ構造はo(1)操作を提供しますか?HashSetが最速の方法ですか?

64
codechobo

セット(Hashset、enumset)およびハッシュ(HashMap、linkedhash ...、idnetityhash ..)ベースの実装を見てください。彼らはO(1) for contains()を持っています

このチートシート は非常に役立ちます。

119

BitSetを使用すると、比較的高密度の数値の特定のケースでは、ハッシュセットよりも高速ではるかに小さくなります。

8
starblue

HashSetよりも高速なデータ構造は、Trove4JのTIntHashSetのみです。これは、整数オブジェクトを使用する必要性を回避するプリミティブを使用します。

整数の数が少ない場合、存在する各値が「true」に変わるboolean []を作成できます。これはO(1)になります。注:HashSetは、O(1)となることは保証されていません。O(log(log(N)))となる可能性が高くなります。

理想的なハッシュ分布ではO(1)のみを取得します。ただし、ハッシュバケットの衝突が発生する可能性が高く、一部のルックアップでは複数の値をチェックする必要があります。

3
Peter Lawrey

hashing(hash set)はO(1)を使用した場合に最適です

0
Satish