web-dev-qa-db-fra.com

complexité multiset, map et hash map

Je voudrais connaître la complexité de la notation Big O des classes STL multiset, map et hash map lorsque:

  • insertion d'entrées
  • accès aux entrées
  • récupération des entrées
  • comparaison des entrées
67
Harry

carte, ensemble, multi-cartes et multi-ensembles

Ceux-ci sont implémentés en utilisant un arbre rouge-noir , un type de arbre de recherche binaire équilibré . Ils ont les temps d'exécution asymptotiques suivants:

Insertion: O (log n)
Recherche: O (log n)
Suppression: O (log n)

hash_map, hash_set, hash_multimap et hash_multiset

Ceux-ci sont implémentés en utilisant tables de hachage . Ils ont les durées d'exécution suivantes:

Insertion: O(1) attendu, O(n) pire cas)
Recherche: O(1) attendu, O(n) pire cas)
Suppression: O(1) attendu, O(n) pire cas)

Si vous utilisez une fonction de hachage appropriée, vous ne verrez presque jamais le pire des cas, mais c'est quelque chose à garder à l'esprit - voir Denial of Service via Algorithmic Complexity Attacks par Crosby et Wallach pour un exemple de ça.

98
Adam Rosenfield

Vous pouvez trouver ces informations dans la documentation SGI STL: http://www.sgi.com/tech/stl/

Fondamentalement, les multisets et les cartes sont des arbres binaires triés, donc l'insertion/la recherche de 1 entrée sur N prend O (log N). Voir Association triée. Conteneurs dans la documentation.

De toute évidence, le gros avantage de Hashmap est O(1) pour l'insertion et la recherche d'entrées.

Y accéder après avoir trouvé est O(1) pour toutes les structures. Comparaison, que voulez-vous dire par là? Cela ressemble à O(1) pour moi, après tous ont été trouvés.

8
ypnos