Quand utiliser hashmaps ou treemaps?
Je sais que je peux utiliser TreeMap pour parcourir les éléments lorsque j'ai besoin de les trier. Mais est-ce juste? Il n'y a pas d'optimisation lorsque je veux juste consulter les cartes, ou des utilisations spécifiques optimales?
Les tables de hachage (généralement) effectuent des opérations de recherche (recherche) limitées par la complexité de O(n)<=T(n)<=O(1)
, avec une complexité de cas moyenne de O(1 + n/k)
; Cependant, les arbres de recherche binaires (BST) effectuent des opérations de recherche (recherche) limitées dans la complexité de O(n)<=T(n)<=O(log_2(n))
, avec une complexité de cas moyenne de O(log_2(n))
. L'implémentation de chaque (et de chaque) structure de données doit être connue (par vous), afin de comprendre les avantages, les inconvénients, la complexité temporelle des opérations et la complexité du code.
Par exemple, le nombre d'entrées dans une table de hachage comporte souvent un nombre fixe d'entrées (dont certaines parties peuvent ne pas être remplies du tout) avec des listes de collisions. Les arbres, d’autre part, ont généralement deux pointeurs (références) par nœud, mais cela peut être plus important si l’implémentation autorise plus de deux nœuds enfants par nœud, ce qui permet à l’arbre de croître au fur et à mesure que des nœuds sont ajoutés, mais peut ne pas permettre. les doublons. (L'implémentation par défaut d'un Java TreeMap n'autorise pas les doublons)
Par exemple, il y a des cas particuliers à considérer. Par exemple, si le nombre d'éléments d'une structure de données particulière augmente sans limite ou approche de la limite d'une partie sous-jacente de la structure de données? Qu'en est-il des opérations amorties qui effectuent des opérations de rééquilibrage ou de nettoyage?
Par exemple, dans une table de hachage, lorsque le nombre d'éléments dans la table devient suffisamment important et qu'un nombre arbitraire de collisions peut se produire. D'autre part, les arbres nécessitent généralement une procédure de rééquilibrage après une insertion (ou une suppression).
Donc, si vous avez quelque chose comme un cache (par exemple, le nombre d’éléments dans les bornes, ou la taille est connue), alors une table de hachage est probablement votre meilleur choix; Cependant, si vous avez quelque chose qui ressemble plus à un dictionnaire (par exemple, peuplé une fois et levé plusieurs fois), j'utiliserais un arbre.
Ceci n’est cependant que dans le cas général (aucune information n’a été donnée). Vous devez comprendre le processus qui se produit pour savoir comment ils choisissent la structure de données à utiliser.
Lorsque j'ai besoin d'une multi-carte (recherche à distance) ou de l'aplatissement trié d'une collection, il ne peut s'agir d'une table de hachage.
TreeMap
fournit un temps de recherche O (log n) garanti (et une insertion, etc.), tandis que HashMap
fournit O(1) temps de recherche si le code de hachage disperse les clés de manière appropriée.
Sauf si vous avez besoin que les entrées soient triées, je resterais avec HashMap
. Ou bien il y a ConcurrentHashMap
bien sûr. Je ne me souviens pas des détails des différences entre eux, mais HashMap
est une option "par défaut" parfaitement raisonnable :)
Pour être complet, je dois souligner qu’il ya environ un mois, il a été discuté du débordement de pile au sujet des composants internes de diverses cartes. Voir le commentaires dans cette question , que je recopierai dans cette réponse si bestsss est heureux pour moi de le faire.
La plus grande différence entre les deux est la structure sous-jacente utilisée dans la mise en œuvre.
HashMaps utilise un tableau et une fonction de hachage pour stocker des éléments. Lorsque vous essayez d'insérer ou de supprimer un élément dans le tableau, la fonction de hachage convertit la clé en un index sur le tableau où l'objet est/doit être stocké (en ignorant les conflits). Bien que les hashmaps soient généralement très rapides car ils ne nécessitent pas d'itération sur de grandes quantités de données, ils ralentissent lorsqu'ils sont remplis, car ils doivent copier toutes les clés/valeurs dans un nouveau tableau.
TreeMaps stocke les données dans une arborescence triée. Bien que cela signifie qu'ils n'auront jamais à allouer plus d'espace et à y copier des données, les opérations nécessitent l'itération d'une partie des données déjà stockées. Parfois, changer de grandes quantités de la structure.
Sur les deux cartes de hachage auront généralement de meilleures performances lorsque vous n'avez pas besoin de trier.
N'oubliez pas qu'il y a aussi LinkedHashMap
qui est presque aussi rapide que HashMap
pour les opérations d'ajout/contenu/supprimer, mais maintient également l'ordre d'insertion.
L'insertion de nouveaux éléments dans une carte de hachage sera, en moyenne, bien plus rapide que l'insertion d'éléments dans une carte d'arbre. À moins que vos éléments ne soient triés, je choisirais HashMap.