Pourquoi l'accès à un élément d'un dictionnaire par la touche O(1) même si la fonction de hachage peut ne pas être en O(1)?
Je vois comment vous pouvez accéder à votre collection par clé. Cependant, la fonction de hachage lui-même a beaucoup d'opérations derrière les coulisses, n'est-ce pas?
En supposant que vous avez une bonne fonction de hachage qui est très efficace, il peut prendre de nombreuses opérations.
Cela peut-il être expliqué?
- O la notation est sur la mesure de la
the growth
de la complexité avec des entrées différentes. Ce n'est pas le nombre d'opérations que vous avez. Par exemple: avec 1 de la valeur, vous avezx
secondes, avecn
valeurs, vous devezroughly
x*n
secondes => O (n).x
pourrait être de nombreuses opérations combinées. - Structures de données n'ont pas O la notation de la complexité, des opérations sur eux.
- Donc, l'opération nous en parler?
- Il explique certains faits au sujet de O(1) complexités sur dictionnaire, peut-être liée à un meilleur mot.
- OP clairement dit que l'accès par clé est que l'opération en question.
- Pour l'enregistrement, il n'est pas que de nombreuses instructions, soit. Les processeurs Intel ont le matériel des instructions pour le faire
SHA
hachages, donc une recherche dans le dictionnaire pourrait être fait en seulement quelques instructions de montage. - Je pense que cette question n'est pas un doublon, car il se concentre sur le hachage ffunction pas être const temps.
- "beaucoup d'opérations" et O(1) sont parfaitement compatibles - O(1) ou à temps constant signifie que, comme le nombre d'éléments de l'approche de l'infini, il existe une certaine constante qui délimite le temps d'exécution. Cette constante peut être arbitraire grande à l'aide d'une fonction de hachage qui est garantie dans un délai d'un an ne serait pas empêcher le système de O(1).
- Pensez à un hachage de recherche en une seule opération.
- Double Possible de Pouvez les tables de hachage vraiment être O(1)?
Vous devez vous connecter pour publier un commentaire.
Qui est certainement vrai. Cependant, le nombre de ces opérations dépend de la taille de la clé, non pas sur la taille de la table de hachage dans lequel la clé est insérée: le nombre d'opérations pour calculer la fonction de hachage est le même pour une clé dans une table de dix ou dix mille entrées.
C'est pourquoi l'appel de la fonction de hachage est souvent considéré comme O(1). Cela fonctionne très bien pour de taille fixe touches (partie intégrante des valeurs et des chaînes de longueur fixe). Il fournit également un décent approximation pour la variable de la taille des touches avec une limite supérieure pratique.
En règle générale, cependant, le temps d'accès d'une table de hachage est O(k), où
k
est la limite supérieure de la taille de la clé de hachage.n
articles distincts, sauf si au moins un élément est représenté par au moinslog(n)
bits.the number of these operations depends on the size of the key
et sur la taille des données cryptées.k
n'a pas besoin d'être une limite supérieure. La recherche du temps est linéaire dans la taille de la clé, donc c'est en effetO(k)
oùk
est la taille de la clé. Sik
est comprise comme une limite supérieure alors il est réellementO(1)
.O(1)
ne veut pas dire instantanée.O(1)
signifie que la constante sans égard à la taille des données. La fonction de hachage prend une certaine quantité de temps, mais ce temps n'évolue pas avec la taille de la collection.GetHashCode()
de combiner les codes de hachage des éléments d'une certaine façon. Si je devais mettre en place une telle classe, pour une mise en œuvre initiale, je voudrais mettre en œuvreGetHashCode()
exactement comme ça. Je voudrais bien sûr la modifier par la suite.if a.equals(b) then hash(a)==hash(b)
. Avoir la collection dans le cadre de la fonction de hachage sera la cause de l'ensemble du dictionnaire d'arrêter de travailler, si cela provoque le hachage de changer si la collecte des changements.Cela signifie que quelle que soit la taille de votre collection peut être, il faudra encore presque la même quantité de temps pour récupérer l'un de ses membres.
Donc, en d'autres mots Dictionnaire avec 5 membres disons petit plus ponctuellement prendre environ 0.002 ms pour accéder à l'un d'entre eux, ainsi que le dictionnaire de 25 membres devraient prendre quelque chose de similaire. Big O signifie que la complexité algorithmique plus de la taille de la collection au lieu de réelle des déclarations ou des fonctions exécutées
Si un dictionnaire/map est mis en œuvre comme un
HashMap
, il a un meilleur des cas, la complexité deO(1)
, depuis que j'ai le meilleur des cas, elle nécessite exactement le calcul du hash-code de l'élément clé de la récupération, si il n'y a pas de clé de collisions.Un de hachage carte peut avoir un pire cas d'exécution de la complexité de
O(n)
si vous avez beaucoup de clé de collisions ou d'une très mauvaise fonction de hachage, puisque dans ce cas, il se dégrade à une analyse linéaire de l'ensemble de la matrice qui contient les données.Aussi,
O(1)
ne veut pas dire instantanément, cela signifie qu'il a un constante montant. Afin de choisir la bonne mise en œuvre pour un dictionnaire peut ainsi dépendre du nombre d'éléments dans la collection, puisque le fait d'avoir une très haute constante des coûts de la fonction sera bien pire si il y a seulement quelques entrées.C'est pourquoi dictionaryies/maps sont mis en œuvre différemment pour les différents scénarios. Pour Java, il existe plusieurs implémentations différentes, C++ utilise le rouge/noir-arbres, etc. Vous avez choisi en fonction du nombre de données et en fonction de leur meilleur/moyenne/pire cas d'exécution-efficacité.
HashMap
stations à l'équilibre de l'arbre dans le cas où il détecte plusieurs collisions.Théoriquement, il est toujours en O(n), car dans le pire des cas, toutes vos données sont peut-être identiques hachage et être regroupés dans ce cas vous aurez à linéairement aller à travers tout cela.
Veuillez voir le post de Ce n' "O(1) temps d'accès" signifie?
Le nombre d'opérations dans une fonction de hachage est sans importance tant qu'il prend le même (constant) montant de temps pour CHAQUE élément de la collection. Par exemple, accéder à un élément dans une collection de 2 éléments prend .001 ms, mais aussi d'accéder à un élément dans une collection de 2,000,000,000 éléments prend .001 mme. Bien que la fonction de hachage peut contenir plusieurs centaines de si les déclarations et plusieurs calculs.
de la documentation:
De sorte qu'il peut être O(1) mais peut être plus long.
Ici vous pouvez trouver un autre thread concernant la table de hachage de la performance: Table de hachage - pourquoi est-il plus rapide que les tableaux?
Une fois que vous laissez pour le fait que de plus en plus grands dictionnaires de prendre plus de mémoire, d'aller plus loin en bas de la hiérarchie du cache et éventuellement hors de ralentir l'espace de swap sur le disque, il est difficile de prétendre que c'est vraiment O(1). La performance du dictionnaire obtiendrez plus lent qu'il est plus grand, probablement donner O(log N) le temps de la complexité. Ne me croyez pas? Essayez vous-même avec 1, 100, 1000, 10000, et ainsi de suite dictionnaire des éléments, jusqu'à-dire 100 milliards de dollars, et de mesurer combien de temps il prend, dans la pratique, pour rechercher un élément.
Toutefois, si vous faire l'hypothèse simplificatrice que la mémoire de votre système est une mémoire à accès aléatoire, et peut être consulté en temps constant, il peut demander que le dictionnaire est O(1). Cette hypothèse est fréquente, même si elle n'est pas vraiment vrai pour n'importe quelle machine avec le disque de l'espace de swap, et encore assez discutable, en tout cas, étant donné les différents niveaux de cache du PROCESSEUR.