web-dev-qa-db-fra.com

Complexité temporelle de la table de hachage

Je suis confus quant à la complexité temporelle de la table de hachage, de nombreux articles indiquent qu'ils sont "amortis O (1)" et non dans l'ordre vrai O(1) qu'est-ce que cela signifie dans les applications réelles. complexité temporelle moyenne des opérations dans une table de hachage, dans la mise en œuvre réelle et non en théorie, et pourquoi les opérations ne sont-elles pas vraies O (1)?

37
marme

Il est impossible de savoir à l'avance combien de collisions vous obtiendrez avec votre fonction de hachage, ainsi que des choses comme la nécessité de redimensionner. Cela peut ajouter un élément d'imprévisibilité aux performances d'une table de hachage, ce qui en fait pas vrai O (1). Cependant, pratiquement toutes les implémentations de table de hachage offrent O(1) sur la vaste, vaste, vaste majorité des insertions. C'est la même chose que l'insertion de tableau - c'est O(1) sauf si vous devez redimensionner, auquel cas il s'agit de O (n), plus l'incertitude de collision.

En réalité, les collisions de hachage sont très rares et la seule condition dans laquelle vous devez vous soucier de ces détails est lorsque votre code spécifique a une fenêtre temporelle très serrée dans laquelle il doit s'exécuter. Pour pratiquement tous les cas d'utilisation, les tables de hachage sont O (1). Plus impressionnante que O(1) insertion est O(1) lookup).

21
Puppy

Pour certaines utilisations des tables de hachage, il est impossible de les créer à l'avance de la "bonne" taille, car on ne sait pas combien d'éléments devront être conservés simultanément pendant la durée de vie de la table. Si vous souhaitez conserver un accès rapide, vous devez redimensionner le tableau de temps en temps au fur et à mesure que le nombre d'éléments augmente. Ce redimensionnement prend un temps linéaire par rapport au nombre d'éléments déjà dans le tableau, et se fait généralement lors d'une insertion, lorsque le nombre d'éléments dépasse un seuil.

Ces opérations de redimensionnement peuvent être effectuées assez rarement pour que le coût amorti d'insertion soit toujours constant (en suivant une progression géométrique pour la taille de la table, par exemple en doublant la taille à chaque fois qu'elle est redimensionnée). Mais une insertion de temps en temps prend O(n) fois car elle déclenche un redimensionnement.

En pratique, ce n'est pas un problème sauf si vous créez des applications en temps réel difficiles.

7
Pascal Cuoq

Insertion une valeur dans une table de hachage prend, dans le cas moyen, O(1) temps . La fonction de hachage est calculée, le bucked est choisi dans la table de hachage, puis l'élément est inséré. Dans le pire des cas, tous les éléments auront haché à la même valeur, ce qui signifie que l'ensemble du la liste de compartiments doit être parcourue ou, dans le cas d'un adressage ouvert, la table entière doit être sondée jusqu'à ce qu'un emplacement vide soit trouvé. Par conséquent, dans le pire des cas, l'insertion prend O(n) temps

voir: http://www.cs.unc.edu/~plaisted/comp550/Neyer%20paper.pdf (Hash Table Section)

2
Rohit Jain