web-dev-qa-db-fra.com

Pourquoi la recherche par hashmap est-elle O(1) c'est-à-dire un temps constant?

Si nous regardons du point de vue de Java, nous pouvons dire que la recherche par hashmap prend du temps constant. Mais qu'en est-il de la mise en œuvre interne? Il devrait toujours chercher dans un compartiment particulier (pour lequel le hashcode de la clé correspond) différentes localisations correspondantes. Alors pourquoi dit-on que la recherche de hashmap prend un temps constant? S'il vous plaît, expliquez.

27
genonymous

Sous les hypothèses appropriées sur la fonction de hachage utilisée, nous pouvons dire que les recherches dans une table de hachage prennent du temps attendu O(1) (en supposant que vous utilisiez un schéma de hachage standard tel que le sondage linéaire ou le hachage chaîné). . Cela signifie que en moyenne , la quantité de travail effectuée par une table de hachage pour effectuer une recherche est tout au plus constante.

Intuitivement, si vous avez une "bonne" fonction de hachage, vous vous attendriez à ce que les éléments soient répartis plus ou moins équitablement dans la table de hachage, ce qui signifie que le nombre d'éléments dans chaque compartiment sera proche du nombre d'éléments divisé par le nombre. des seaux. Si la mise en œuvre de la table de hachage maintient ce nombre bas (en ajoutant, par exemple, plusieurs compartiments chaque fois que le rapport éléments sur compartiments dépasse une constante), la quantité de travail attendue finit par être une quantité de travail de base pour choisir le compartiment. doivent être scannés, puis ne pas "trop" travailler sur les éléments présents, car, dans l’espoir, il n’y aura qu’un nombre constant d’éléments dans ce compartiment.

Cela ne signifie pas que les tables de hachage ont un comportement garanti O(1). En fait, dans le pire des cas, le schéma de hachage dégénérera et tous les éléments se retrouveront dans un compartiment, ce qui rendra les recherches plus longues (n) dans le pire des cas. C'est pourquoi il est important de concevoir de bonnes fonctions de hachage.

Pour plus d'informations, vous pouvez consulter un manuel d'algorithmes pour connaître la dérivation formelle de la raison pour laquelle les tables de hachage prennent en charge les recherches de manière aussi efficace. Ceci est généralement inclus dans le cadre d'un cours universitaire typique sur les algorithmes et les structures de données, et il existe de nombreuses bonnes ressources en ligne.

Anecdote: il existe certains types de tables de hachage (tables de hachage coucou, tables de hachage parfaites dynamiques) où le pire des cas le temps de recherche d'un élément est O (1). Ces tables de hachage fonctionnent en garantissant que chaque élément ne peut se trouver que dans une des quelques positions fixes, les insertions brouillant parfois autour des éléments pour tenter de tout ajuster.

J'espère que cela t'aides!

32
templatetypedef

La clé est dans cette déclaration dans la documentation:

Si de nombreux mappages doivent être stockés dans une instance HashMap, sa création avec une capacité suffisamment grande permettra de stocker les mappages plus efficacement que de le laisser effectuer un rehachage automatique selon les besoins pour agrandir la table.

et

Le facteur de charge est une mesure de la capacité de la table de hachage à être pleine avant que sa capacité ne soit automatiquement augmentée. Lorsque le nombre d'entrées dans la table de hachage dépasse le produit du facteur de charge et de la capacité actuelle, la table de hachage est réorganisée (c'est-à-dire que les structures de données internes sont reconstruites) afin que la table de hachage ait environ deux fois le nombre de compartiments.

http://docs.Oracle.com/javase/6/docs/api/Java/util/HashMap.html

La structure du compartiment interne sera en fait reconstruite si le facteur de charge est dépassé, ce qui permet au coût amorti de get et à put d'être O (1).

Notez que si la structure interne est reconstruite, cela entraîne une pénalité de performance susceptible d'être O (N). Par conséquent, plusieurs get et put peuvent être nécessaires avant le coût amorti. approche à nouveau O(1). Pour cette raison, planifiez la capacité initiale et le facteur de charge de manière appropriée, afin de ne pas gaspiller d'espace, ni déclencher une reconstruction évitable de la structure interne.

7
Eric J.

Pour donner également suite aux commentaires de templatetypedef:

L'implémentation à temps constant d'une table de hachage peut être une table de hachage, avec laquelle vous pouvez implémenter une liste de tableaux booléens indiquant si un élément particulier existe dans un compartiment. Toutefois, si vous implémentez une liste liée pour votre hashmap, dans le pire des cas, vous devrez parcourir tous les compartiments et devoir parcourir les extrémités des listes.

0
jim-zed-li