web-dev-qa-db-fra.com

Complexité temporelle de find () dans std :: map?

Quelle est l'efficacité de la fonction find () sur la classe std :: map? Est-ce qu'il parcourt tous les éléments à la recherche de la clé telle que c'est O (n), ou est-ce dans un arbre équilibré, ou utilise-t-il une fonction de hachage ou quoi?

20
Avi

Log (n) Il est basé sur un arbre rouge noir.

Edit: n est bien sûr le nombre de membres sur la carte.

35
David D

std::map et std::set sont implémentés par les éditeurs de compilateurs à l'aide d'arbres de recherche binaires très équilibrés (par exemple, arbre rouge-noir, arbre AVL).

Comme l'a correctement indiqué David, find prendrait O (log n), où n est le nombre d'éléments dans le conteneur.

Mais c'est avec des types de données primitifs comme int, long, char, double etc., pas avec des chaînes.

Si std:string, disons de la taille 'm', est utilisé comme clé, la traversée de la hauteur de l'arbre de recherche binaire équilibrée nécessitera un log n comparaisons de la clé donnée avec une entrée de l'arbre.

Quand std::string est la clé du std::map ou std::set, find et insert les opérations coûteront O (m log n), où m est la longueur de la chaîne donnée qui doit être trouvée.

19
Arif Ali Saiyed

Il n'itère pas tous les éléments, il effectue une recherche binaire (qui est O (log (n))). Il utilise l'opérateur <ou un comparateur pour effectuer la recherche.

Si vous voulez une carte de hachage, vous pouvez utiliser un std :: unordered_map (ajouté sur C++ - 0x), qui utilise une fonction de hachage et en moyenne (en fonction de la fonction de hachage et des données que vous fournissez) find () sera O (1 ).

3
fbafelipe