Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
991 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  map vs hash map

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

map vs hash map

n°1845524
weblook$$
Posté le 31-01-2009 à 14:38:01  profilanswer
 

Hi,
 
Je suis un peu perdu... Il y a une différence entre une map et une hash map ?
 
En C++ je connais un petit peu la map de la std, existe t-il une classe map dans boost ?
Si il y a une différence entre map et hash map, existe t-il une hash map dans la std? dans boost?
 
Merci

mood
Publicité
Posté le 31-01-2009 à 14:38:01  profilanswer
 

n°1845527
Elmoricq
Modérateur
Posté le 31-01-2009 à 14:47:22  profilanswer
 

Pas de différence entre hashmap et map dans le principe, les deux désignent un tableau associatif. En Java à la limite, où Map est une interface et Hashmap une implémentation, mais en C++, dans la STL, il n'y a que std::map qui remplit très bien son office.
Pour la doc C++, tu peux aller ici : http://cplusplus.com
 
Pour boost je ne peux pas répondre à tes questions.

Message cité 1 fois
Message édité par Elmoricq le 31-01-2009 à 14:47:43
n°1845538
Un Program​meur
Posté le 31-01-2009 à 15:17:37  profilanswer
 

std::map est implémenté à base d'arbres binaires équilibrés (c'est pourquoi il lui faut une fonction de comparaison).
 
Il y a pas mal d'implémentations de la bibliothèque standard qui fournisse aussi une hash_map implémentée à base de tables de hachage.  C++0X aura une std::unordered_map à cet effet (pas hash_map pour éviter la confusion avec les implémentations existantes, qui sont incomptabibles entre elles).

n°1845614
Taz
bisounours-codeur
Posté le 31-01-2009 à 18:37:10  profilanswer
 

Elmoricq a écrit :

Pas de différence entre hashmap et map dans le principe, les deux désignent un tableau associatif. En Java à la limite, où Map est une interface et Hashmap une implémentation, mais en C++, dans la STL, il n'y a que std::map qui remplit très bien son office.
Pour la doc C++, tu peux aller ici : http://cplusplus.com
 
Pour boost je ne peux pas répondre à tes questions.


Euh, moi je vois le fait qu'une map soit ordonnée comme une de ces caractéristiques principales.

n°1845630
Elmoricq
Modérateur
Posté le 31-01-2009 à 19:16:27  profilanswer
 

Ah oui, bien vu. :jap:

n°1845692
weblook$$
Posté le 01-02-2009 à 00:07:30  profilanswer
 

ordonnée, selon ses clefs ou ses données ??

n°1845696
Gf4x3443
Killing perfection
Posté le 01-02-2009 à 01:37:48  profilanswer
 
n°1845780
jesus_chri​st
votre nouveau dieu
Posté le 01-02-2009 à 12:23:21  profilanswer
 

map :
- temps d'accès en log2(n) * K
- ordonnée (par le critère que tu veux sur les clés)
- nécéssite une relation d'ordre stric sur les clés (typiquement l'operateur< ), ayant une complexité de K (typiquement O(1))
- ne déplace pas ses nodes (ajouter/supprimer un élément n'invalide pas les autres iterateurs)
 
hash_map (ou unordered_map, c'est pareil)
- temps d'accés en O(1) * K en général mais O(n) dans le (rare) pire des cas.
- pas ordonnée (d'où son nom)
- nécéssite une fonction de hashage ET une fonction de comparaison (typiquement l'operateur==), ayant une complexité de K (typiquement O(1))
- peut déplacer ses nodes, ça dépend de l'implémentation. Certaines version de STLPort déplacent les nodes, mais pas celles de microsoft. Donc ajouter/supprimer un élément invalide tous les itérateurs. Le futur standard C++0x imposera de ne pas déplacer ses nodes, mais c'est pas encore appliqué.
 
J'introduis la compléxité K car elle est souvent négligée, mais pas négligeable. Pour une map de std::string par exemple, comparer 2 strings (avec < ou ==) est en compléxité O(m), avec m la longueur des strings. Ca peut être grand devant log2(n), et d'autant plus devant O(1). D'où l'intérêt de bien optimiser les fonctions de comparaison et de hashage. La fonction de hashage doit à la fois être performante et ne pas provoquer trop de collisions.

n°1845789
Joel F
Real men use unique_ptr
Posté le 01-02-2009 à 12:44:37  profilanswer
 

jesus_christ a écrit :

map :
- temps d'accès en log2(n) * K
- ordonnée (par le critère que tu veux sur les clés)
- nécéssite une relation d'ordre stric sur les clés (typiquement l'operateur< ), ayant une complexité de K (typiquement O(1))
- ne déplace pas ses nodes (ajouter/supprimer un élément n'invalide pas les autres iterateurs)


T'as le bout de doc qui en parle ? Je me suis pris le bec la dessus avec un collègue et pas moyen de retrouver le bout qui dit ça.

n°1845802
Un Program​meur
Posté le 01-02-2009 à 13:52:38  profilanswer
 

Section 23.1.2 (Table 69) de la norme.

mood
Publicité
Posté le 01-02-2009 à 13:52:38  profilanswer
 

n°1845804
Joel F
Real men use unique_ptr
Posté le 01-02-2009 à 14:11:21  profilanswer
 

nickel merci

n°1845824
0x90
Posté le 01-02-2009 à 16:01:30  profilanswer
 

jesus_christ a écrit :

[...]
J'introduis la compléxité K car elle est souvent négligée, mais pas négligeable. Pour une map de std::string par exemple, comparer 2 strings (avec < ou ==) est en compléxité O(m), avec m la longueur des strings. Ca peut être grand devant log2(n), et d'autant plus devant O(1). D'où l'intérêt de bien optimiser les fonctions de comparaison et de hashage. La fonction de hashage doit à la fois être performante et ne pas provoquer trop de collisions.


 
Dans ce cas, un trie sera peut être plus adapté.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1845828
Taz
bisounours-codeur
Posté le 01-02-2009 à 16:31:18  profilanswer
 

0x90 a écrit :


 
Dans ce cas, un trie sera peut être plus adapté.


Ouais enfin bon O(m) c'est du O.
En implémentant bien == ou < pour des chaînes, on sort vite de l'ornière. Là tu vas me dire "oui mais si les chaînes sont de même taille et avec un préfixe commun" ... ben je te retourne le problème avec ta trie qui se transforme en liste chaînée / peigne.
(Mais on ne parle pas de la complexité du stockage)

n°1845831
0x90
Posté le 01-02-2009 à 16:43:56  profilanswer
 

Taz a écrit :


Ouais enfin bon O(m) c'est du O.
En implémentant bien == ou < pour des chaînes, on sort vite de l'ornière. Là tu vas me dire "oui mais si les chaînes sont de même taille et avec un préfixe commun" ... ben je te retourne le problème avec ta trie qui se transforme en liste chaînée / peigne.
(Mais on ne parle pas de la complexité du stockage)


 
Y'avait "peut être" dans ma phrase :o Ça dépends clairement du dataset mais c'est jamais mauvais de savoir que ça existe et de penser à essayer le jour ou une (hash_)map à du mal.
 


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  map vs hash map

 

Sujets relatifs
Petit problème avec un hash, des tableaux et des référencestirer un hash de hash
Comparaison de valeurs dans deux Hash[perl] table hash multidimensionnel
fonction avec table hash en parametre[Java] Générer un hash MD5
Hash sha256 en PHP4 ?Passer un tableau ou une hash Perl à JavaScript
Hash fichier pour comparaisonsort hash
Plus de sujets relatifs à : map vs hash map


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR