L'histoire selon laquelle les tables de hachage sont amorties est un mensonge une simplification excessive. Θ(1)
Cela n'est vrai que si:
- La quantité de données à hacher par élément est triviale par rapport au nombre de K eys et la vitesse de hachage d'un K ey est rapide - .
- Le nombre de C ollisions est petit - .
- Nous ne pas prendre en compte le temps nécessaire à la R edimension la table de hachage - .k
c
r
Grandes chaînes à hacher
Si la première hypothèse est fausse, le temps d'exécution ira jusqu'à .
Cela est certainement vrai pour les grandes chaînes, mais pour les grandes chaînes, une comparaison simple aurait également un temps d'exécution de . Un hachage n'est donc pas asymptotiquement plus lent, bien que le hachage soit toujours plus lent qu'une simple comparaison, car la comparaison a une option de désactivation précoce ergo , et le hachage doit toujours hacher la chaîne complète , . Θ(k)
Θ(k)O(1)Ω(k)O(k)Ω(k)
Notez que les entiers croissent très lentement. 8 octets peuvent stocker des valeurs jusqu'à ; 8 octets est un montant trivial à hacher.
Si vous voulez stocker des bigints, considérez-les simplement comme des chaînes. 1018
Algorithme de hachage lent
Si le montant dépensé pour le hachage n'est pas trivial par rapport au stockage des données, alors l' hypothèse devient évidemment intenable.
À moins qu'un hachage cryptographique ne soit utilisé, cela ne devrait pas poser de problème.Θ(1)
Ce qui importe, c'est que . Tant que cela contient est une déclaration juste.n >> kΘ(1)
De nombreuses collisions
Si la fonction de hachage est médiocre, ou la table de hachage est petite, ou la taille de la table de hachage est maladroite, les collisions seront fréquentes et le temps d'exécution ira à .
La fonction de hachage doit être choisie de manière à ce que les collisions soient rares tout en étant aussi rapides que possible, en cas de doute, optez pour moins de collisions au détriment d'un hachage plus lent.
En règle générale, la table de hachage doit toujours être remplie à moins de 75%.
Et la taille de la table de hachage ne doit pas avoir de corrélation avec la fonction de hachage.
Souvent, la taille de la table de hachage est (relativement) première. O(log(n))
Redimensionner la table de hachage
Puisqu'une table de hachage presque pleine donnera trop de collisions et qu'une grande table de hachage (vide) est un gaspillage d'espace, de nombreuses implémentations permettent à la table de hachage de croître (et de rétrécir!) Selon les besoins.
La croissance d'une table peut impliquer une copie complète de tous les éléments (et éventuellement un remaniement), car le stockage doit être continu pour des raisons de performances.
Ce n'est que dans des cas pathologiques que le redimensionnement de la table de hachage sera un problème, de sorte que les redimensionnements (coûteux mais rares) sont amortis sur de nombreux appels.
Temps d'exécution Le temps
réel d'exécution d'une table de hachage est donc .
Chacun de , , en moyenne est supposé être une (petite) constante dans le temps de fonctionnement amorti et nous disons donc que est une déclaration juste. Θ(kcr)
kcrΘ(1)
Pour revenir à vos questions
Veuillez m'excuser de paraphraser, j'ai essayé d'extraire différents ensembles de sens, n'hésitez pas à commenter si j'en ai oublié
Vous semblez préoccupé par la longueur de la sortie de la fonction de hachage. Appelons cela ( est généralement considéré comme le nombre d'éléments à hacher). sera car m doit identifier de manière unique une entrée dans la table de hachage.
Cela signifie que m croît très lentement. À 64 bits, le nombre d'entrées de table de hachage occupera une partie importante de la mémoire RAM disponible dans le monde. À 128 bits, il dépassera de loin le stockage sur disque disponible sur la planète Terre.
Produire un hachage 128 bits n'est pas beaucoup plus difficile qu'un hachage 32 bits, donc non , le temps de créer un hachage n'est pas (ou si vous voulez). mnmlog(n)
O(m)O(log(n))
La fonction de hachage passant par bits d'élément va prendre temps. log(n)Θ(log(n))
Mais la fonction de hachage ne passe pas par les bits des éléments.
Pour un élément (!!), il ne passe que par les données .
De plus, la longueur de l'entrée (k) n'a aucun rapport avec le nombre d'éléments. Cela est important, car certains algorithmes non hachés doivent examiner de nombreux éléments de la collection pour trouver un élément (non) correspondant.
Le tableau de hachage ne fait en moyenne qu'une ou deux comparaisons par élément considéré avant d'arriver à une conclusion. log(n)
O(k)
Pourquoi les tables de hachage sont-elles efficaces pour stocker des éléments de longueur variable?
Parce que quelle que soit la longueur de l'entrée ( ), la longueur de la sortie ( ) est toujours la même, les collisions sont rares et le temps de recherche est constant.
Cependant, lorsque la longueur de clé augmente par rapport au nombre d'éléments dans la table de hachage ( ), l'histoire change ...km
kn
Pourquoi les tables de hachage sont-elles efficaces pour stocker de grandes chaînes?
Les tables de hachage ne sont pas très efficaces pour les très grandes chaînes.
Si ce (c'est-à-dire que la taille de l'entrée est plutôt grande par rapport au nombre d'éléments dans la table de hachage), nous ne pouvons plus dire que le hachage a un temps de fonctionnement constant, mais doit passer à un temps de fonctionnement de surtout parce qu'il n'y a pas de sortie anticipée. Vous devez hacher la clé complète. Si vous ne stockez qu'un nombre limité d'articles, il vaut mieux utiliser un stockage trié, car lorsque vous comparez vous pouvez vous désinscrire dès qu'une différence apparaît. not n>>kΘ(k)k1 ≠ k2
Cependant, si vous connaissez vos données, vous pouvez choisir de ne pas hacher la clé complète, mais uniquement la partie volatile (connue ou supposée) de celle-ci, en restaurant la propriété tout en gardant les collisions en échec. Θ(1)
Constantes cachées
Comme tout le monde devrait le savoir signifie simplement que le temps par élément traité est une constante. Cette constante est un peu plus grande pour le hachage que pour la comparaison simple.
Pour les petites tables, une recherche binaire sera plus rapide qu'une recherche de hachage, car par exemple 10 comparaisons binaires pourraient très bien être plus rapides qu'un seul hachage.
Pour les petits ensembles de données, des alternatives aux tables de hachage doivent être envisagées.
C'est sur de grands ensembles de données que les tables de hachage brillent vraiment.Θ(1)