La clé est-elle consultée sur std::map
O (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?
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.
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.
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).