web-dev-qa-db-fra.com

La structure de données la plus rapide pour contains () en Java?

Quelle est la structure de données dans Java qui a l'opération la plus rapide pour contains ()?

par exemple. j'ai un ensemble de nombres {1, 7, 12, 14, 20 ...}

Étant donné un autre nombre arbitraire x, quel est le moyen le plus rapide (en moyenne) de générer la valeur booléenne de savoir si x est contenu dans l'ensemble ou non? La probabilité pour! Contains () est environ 5 fois plus élevée.

Est-ce que toutes les structures de carte fournissent une opération o(1)? HashSet est-il le plus rapide?)

64
codechobo

regardez les implémentations basées sur set (Hashset, enumset) et hash (HashMap, linkedhash ..., idnetityhash ..). ils ont O(1) pour contains ()

Ce cheatsheet est d'une grande aide.

119
Aravind R. Yarram

Pour votre cas particulier de nombres avec une densité relativement élevée, j'utiliserais un BitSet, il sera plus rapide et beaucoup plus petit qu'un ensemble de hachage.

8
starblue

La seule structure de données plus rapide que HashSet est probablement TIntHashSet de Trove4J. Cela utilise des primitives évitant d'avoir à utiliser des objets entiers.

Si le nombre d'entiers est petit, vous pouvez créer un booléen [] où chaque valeur présente est transformée en "vrai". Ce sera O (1). Remarque: HashSet n'est pas garanti comme étant O(1) et est plus susceptible d'être O (log (log (N)))).

Vous n'obtiendrez que O(1) pour une distribution de hachage idéale. Cependant, il est plus probable que vous obteniez des collisions de compartiments hachés et certaines recherches devront vérifier plus d'une valeur.

3
Peter Lawrey

le hachage (jeu de hachage) est le meilleur avec O (1)

0
Satish