web-dev-qa-db-fra.com

Quelle est la complexité temporelle de HashMap.containsKey () en Java?

J'ai besoin de savoir: Quelle est la complexité temporelle de HashMap.containsKey () en Java?

46
Hossein

À partir du API doc of HashMap :

Cette implémentation fournit des performances à temps constant pour les opérations de base (get et put), en supposant que la fonction de hachage disperse les éléments correctement entre les compartiments.

Puisque containsKey() est juste un get() qui jette la valeur récupérée, c'est O(1) (en supposant que la fonction de hachage fonctionne correctement, encore une fois).

55
Michael Borgwardt

Généralement O (1), mais si nous utilisons une mauvaise fonction hashCode, nous devons ajouter plusieurs éléments à un compartiment afin qu'il puisse être O(n) dans le pire des cas).

13
mishadoff

C'est O(1) en général, mais dans le pire des cas c'est O(n)

 public boolean containsKey(Object key) {
  352           return getEntry(key) != null;
  353       }
  354   
  355       /**
  356        * Returns the entry associated with the specified key in the
  357        * HashMap.  Returns null if the HashMap contains no mapping
  358        * for the key.
  359        */
  360       final Entry<K,V> getEntry(Object key) {
  361           int hash = (key == null) ? 0 : hash(key.hashCode());
  362           for (Entry<K,V> e = table[indexFor(hash, table.length)];
  363                e != null;
  364                e = e.next) {
  365               Object k;
  366               if (e.hash == hash &&
  367                   ((k = e.key) == key || (key != null && key.equals(k))))
  368                   return e;
  369           }
  370           return null;
  371       }
9
Jigar Joshi

La complexité temporelle de containsKey a changé dans JDK-1.8, comme d'autres l'ont mentionné, c'est O(1) dans les cas idéaux. Cependant, en cas de collisions où les keys sont Comparable, les bacs stockant les éléments en collision ne sont plus linéaires après avoir dépassé un certain seuil appelé TREEIFY_THRESHOLD, Qui est égal à 8,

/**
 * The bin count threshold for using a tree rather than list for a
 * bin.  Bins are converted to trees when adding an element to a
 * bin with at least this many nodes. The value must be greater
 * than 2 and should be at least 8 to mesh with assumptions in
 * tree removal about conversion back to plain bins upon
 * shrinkage.
 */
static final int TREEIFY_THRESHOLD = 8;

Dans un autre Word, TreeNodes sera utilisé (similaire à ceux de TreeMap) pour stocker les bacs, (c'est-à-dire: une structure arborescente Rouge-Noir) et cela nous laisse avec un O(lgn) complexité en cas de collision.

Il en va de même pour get(key) où les deux méthodes appellent getNode en interne

Remarque: n voici la taille du bin et non du HashMap

6
Sleiman Jneidi