J'ai besoin de savoir: Quelle est la complexité temporelle de HashMap.containsKey () en Java?
À 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).
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).
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 }
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