Je suis d'accord :
- la complexité générale amortie de O(1)
- une mauvaise
hashCode()
pourrait entraîner des collisions multiples, ce qui signifie que, dans le pire des cas, tous les objets se retrouvent dans le même seau, ce qui signifie que O( N ) si chaque godet est soutenu par une carte de crédit. List
.
- depuis Java 8,
HashMap
remplace dynamiquement les Nodes (liste chaînée) utilisés dans chaque bucket par des TreeNodes (arbre rouge-noir lorsqu'une liste dépasse 8 éléments), ce qui donne une performance maximale de O( logN ).
Mais, c'est no la vérité complète si l'on veut être précis à 100%. La mise en œuvre de hashCode()
et le type de clé Object
(immuable/caché ou étant une collection) pourrait également affecter la complexité en temps réel en termes stricts.
Supposons les trois cas suivants :
HashMap<Integer, V>
HashMap<String, V>
HashMap<List<E>, V>
Ont-ils la même complexité ? Eh bien, la complexité amortie de la 1ère est, comme prévu, O(1). Mais, pour le reste, nous devons également calculer hashCode()
de l'élément de recherche, ce qui signifie que nous pourrions avoir à traverser des tableaux et des listes dans notre algorithme.
Supposons que la taille de tous les tableaux/listes ci-dessus est de k . Alors, HashMap<String, V>
y HashMap<List<E>, V>
aura une complexité amortie de O(k) et de même, O( k + logN ) le pire cas dans Java8.
*Notez que l'utilisation d'un String
est un cas plus complexe, parce qu'elle est immuable et que Java met en cache le résultat de l'opération hashCode()
dans une variable privée hash
de sorte qu'il n'est calculé qu'une seule fois.
/** Cache the hash code for the string */
private int hash; // Default to 0
Mais, ce qui précède a également son propre pire cas, parce que la méthode Java String.hashCode()
vérifie si hash == 0
avant de calculer hashCode
. Mais bon, il y a des chaînes non vides qui produisent une hashcode
de zéro, comme "f5a5a608", cf. aquí Dans ce cas, la mémorisation peut ne pas être utile.
1 votes
Vous pouvez vous renseigner sur le concept de complexité amortie. Voir par exemple ici : stackoverflow.com/questions/3949217/time-complexity-of-hash-table La complexité dans le pire des cas n'est pas la mesure la plus importante pour une table de hachage.
3 votes
Correct c'est amorti O(1) -- n'oubliez jamais la première partie et vous n'aurez pas ce genre de questions :)
1 votes
La complexité temporelle dans le pire des cas est O(logN) depuis Java 1.8 si je ne me trompe pas.