Ce qui est plus rapide pour trouver un élément dans une table de hachage ou dans une liste triée?
Qui est plus rapide à trouver un élément dans une table de hachage ou dans une liste triée?
Vous devez vous connecter pour publier un commentaire.
Qui est plus rapide à trouver un élément dans une table de hachage ou dans une liste triée?
Vous devez vous connecter pour publier un commentaire.
La complexité de l'algorithme est une bonne chose à savoir, et les tables de hachage sont connus pour être O(1) tout en un vecteur trié (dans votre cas, je suppose qu'il est préférable d'utiliser un tableau trié d'une liste) fournira O(log n) temps d'accès.
Mais vous devez savoir que la complexité de notation vous donne le temps d'accès pour N allant à l'infini. Cela signifie que si vous savez que vos données va continuer de croître, la complexité de notation vous donne un indice sur l'algorithme choisi.
Quand vous savez que vos données vont garder un plutôt faible longueur: par exemple avoir seulement quelques entrées dans votre tableau/table de hachage, vous devez vous rendre avec votre montre et à mesure. Donc, un test.
Par exemple, dans un autre problème: le tri d'un tableau. Pour quelques entrées de tri à bulles tout en O(N^2) peut être plus rapide que .. le tri rapide, alors qu'il est O(n log n).
Aussi, en conséquence, pour les autres réponses, et en fonction de votre élément, vous devez essayer de trouver la meilleure fonction de hachage pour votre table de hachage exemple. Sinon il peut conduire à de profonds mauvaise performance pour la recherche dans votre table de hachage (comme l'a fait remarquer dans Hank Gay de réponse).
Edit: jetez un oeil à cet article pour comprendre la signification de la notation Grand O .
En supposant que par "liste triée' vous entendez par "hasard-accessible, triés collection". Une liste a la propriété que vous ne pouvez traverser l'élément par élément, ce qui résultera en un temps O(N) la complexité.
Le moyen le plus rapide pour trouver un élément dans une triés indexables la collecte est réalisée par N-aire de recherche, O(logN), tandis qu'une table de hachage sans collissions a trouver complexité de O(1).
À moins que l'algorithme de hachage est extrêmement lent (et/ou mauvais), la table de hachage sera plus rapide.
Mise à JOUR: Comme les commentateurs l'ont souligné, vous pouvez également faire de la dégradation des performances d'un trop grand nombre de collisions non pas parce que votre algorithme de hachage qui est mauvais, mais tout simplement parce que la table de hachage n'est pas assez grand. La plupart des implémentations de la bibliothèque (au moins dans les langages de haut niveau) seront automatiquement la croissance de votre table de hachage derrière les coulisses—qui va provoquer plus lent que prévu de la performance sur l'insert qui déclenche la croissance—mais si vous êtes roulement de votre propre, il est certainement quelque chose à considérer.
La
get
opération dans unSortedList
estO(log n)
alors que la même opération e une table de hachage estO(1)
. Donc, normalement, leHashTable
serait beaucoup plus rapide. Mais cela dépend d'un certain nombre de facteurs:Il dépend entièrement de la quantité de données que vous avez stockées.
En supposant que vous avez assez de mémoire pour jeter à elle (donc la table de hachage est assez grand), la table de hachage de localiser la cible de données en un montant fixe de temps, mais la nécessité de calculer la valeur de hachage d'ajouter un peu (aussi fixe de charge).
À la recherche d'une liste triée de ne pas avoir que le hachage de frais généraux, mais le temps requis pour faire le travail de la localisation de la cible de données augmentera à mesure que la liste s'accroît.
Donc, en général, une liste triée sera généralement plus rapide pour les petits ensembles de données. (Pour les très petits ensembles de données qui sont fréquemment modifiées et/ou peu cherché, un de l'onuliste triée peut être encore plus rapide, car elle évite la surcharge de faire le tri.) Comme l'ensemble de données devient importante, la croissance de la liste de recherche de temps éclipse les frais fixes de hachage, et la table de hachage devient plus rapide.
Où ce point d'arrêt est variera selon les spécificités de votre table de hachage et le tri de la liste de recherche mises en œuvre. Exécuter des tests et de l'indice de performance sur un certain nombre de généralement de la taille des ensembles de données pour voir ce qui aura pour effet de mieux fonctionner dans votre cas particulier. (Ou, si le code s'exécute déjà "assez rapide", n'en ont pas. Suffit d'utiliser celui que vous êtes plus à l'aise avec et ne vous inquiétez pas au sujet de l'optimisation de quelque chose qui n'a pas besoin d'être optimisé.)
Dans certains cas, cela dépend de la taille de la collection (et à un moindre degré, la mise en œuvre de détails). Si votre liste est très faible, de 5 à 10 éléments, peut-être, je suppose, la liste serait plus rapide. Sinon xtofl a droite.
HashTable serait plus efficace pour la liste contenant plus de 10 articles. Si la liste a moins de 10 articles, les frais généraux en raison de hachage algo sera plus.
Dans le cas où vous avez besoin d'un rapide dictionnaire, mais aussi besoin de conserver les articles, d'une manière ordonnée utiliser le OrderedDictionary. (.Net 2.0 et suivantes)