web-dev-qa-db-fra.com

Carte STL C++: le temps d'accès est-il O (1)?

La clé est-elle consultée sur std::mapO (1)? Je pensais que c'était jusqu'à ce que j'y réfléchisse plus. Il est basé sur une implémentation arborescente, le temps de recherche doit donc être O (log N), correct?

Et est-il possible que O(1) lève les yeux sur la clé de chaîne, std::unordered_map peut-être?

26
stewart99

La complexité de la recherche de std::map est O (log N) (logarithmique dans la taille du conteneur).

Selon le paragraphe 23.4.4.3/4 de la norme C++ 11 sur std::map::operator []:

Complexité: logarithmique.

La complexité de la recherche pour std::unordered_map est O(1) (constante) dans le cas moyen, et O(N) (linéaire) dans le pire des cas.

Selon le paragraphe 23.5.4.3/4 de la norme C++ 11 sur std::unordered_map::operator []

Complexité: Cas moyen O (1), cas le plus défavorable O (size()).

REMARQUE:

Si votre question ne concerne que complexité de calcul, alors ce qui est écrit ci-dessus devrait y répondre. En effet, la complexité de calcul d’une opération est mesurée en fonction de la taille du conteneur (nombre d’éléments qu’il contient).

Toutefois, si vous cherchez un moyen d'effectuer O(1) une recherche sur un conteneur utilisant des clés de chaîne, la complexité de la recherche étant constante par rapport à la longueur de la chaîne). plutôt que par la taille du conteneur, la réponse est que std::unordered_map ne répondra pas à vos exigences.

Pour rechercher une clé, il faut d’abord en produire un hachage; lorsque la clé est une chaîne, cette opération elle-même peut être linéaire dans la taille de la chaîne. Ensuite, la mise en œuvre doit comparer la clé à toutes les clés de chaîne du même compartiment, et chacune de ces comparaisons est à son tour linéaire dans la taille de ces chaînes.

41
Andy Prowl

Oui, en effet std::map sera O(log N) et std::unordered_map aura une complexité moyenne constante et O(N) dans le pire des cas s'il y a trop de collisions de hachage.

5
Shafik Yaghmour

Basicaly std :: map est implémenté en utilisant un arbre rouge-noir. Dans une arborescence rouge-noire, l'opération d'insertion et de suppression prend O(LogN), donc dans std :: map time, la complexité est O(LogN) de chaque élément.

std :: unodered_map est implémenté en utilisant un hachage, où chaque opération prend du temps O(1).

0
Savaliya Vivek