En pratique, c'est O(1), mais il s'agit en fait d'une simplification terrible et mathématiquement insensée. La notation O() indique comment l'algorithme se comporte lorsque la taille du problème tend vers l'infini. Hashmap get/put fonctionne comme un algorithme O(1) pour une taille limitée. La limite est assez grande du point de vue de la mémoire de l'ordinateur et de l'adressage, mais loin de l'infini.
Lorsque l'on dit que l'entrée/sortie d'un hashmap est O(1), on devrait en fait dire que le temps nécessaire à l'entrée/sortie est plus ou moins constant et ne dépend pas du nombre d'éléments du hashmap, dans la mesure où le hashmap peut être présenté sur le système informatique actuel. Si le problème dépasse cette taille et que nous avons besoin de hashmaps plus grands, il est certain qu'au bout d'un certain temps, le nombre de bits décrivant un élément augmentera également, car il n'y aura plus d'éléments différents pouvant être décrits. Par exemple, si nous avons utilisé un hashmap pour stocker des nombres de 32 bits et que plus tard nous augmentons la taille du problème de sorte que nous aurons plus de 2^32 éléments de bits dans le hashmap, alors les éléments individuels seront décrits avec plus de 32 bits.
Le nombre de bits nécessaires pour décrire les éléments individuels est log(N), où N est le nombre maximum d'éléments, donc get et put sont en réalité O(log N).
Si vous le comparez avec un ensemble d'arbres, qui est O(log n), alors l'ensemble de hachage est O(long(max(n)) et nous pensons simplement que c'est O(1), parce que sur une certaine implémentation max(n) est fixé, ne change pas (la taille des objets que nous stockons mesurée en bits) et l'algorithme calculant le code de hachage est rapide.
Enfin, si la recherche d'un élément dans n'importe quelle structure de données était O(1), nous créerions de l'information à partir de rien. Avec une structure de données de n éléments, je peux sélectionner un élément de n façons différentes. Avec cela, je peux coder une information de log(n) bits. Si je peux coder cela en zéro bit (c'est ce que signifie O(1)), alors j'ai créé un algorithme ZIP à compression infinie.
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.