Pour une raison quelconque, je dois l'implémenter moi-même, et je ne peux pas utiliser libs. Pour mapper rapidement, d'abord, je mappe la clé à un entier, et utilise cet entier comme une clé interne. Ensuite, j'applique la carte, qui me donne la fonction de cartographie. Cependant, lorsque j'utilise la clé de chaîne pour calculer la clé entière interne, il m'arrive d'obtenir le même nombre entier à partir d'une chaîne différente. Comment puis-je résoudre le problème?Implémentation de Map <string, string> dans C
Répondre
Vous ne pouvez pas éviter cela. Il y a plus de chaînes possibles que d'entiers, donc les collisions de hachage sont imminentes. Lisez les hashmaps - c'est une structure de données qui prend explicitement en compte les collisions et qui les contourne.
Ceci est ce que l'on appelle des collisions, mais le plus simple consiste à faire de chaque compartiment de votre Hashmap une liste d'éléments ayant le même hachage. Ensuite, sur un obtenez tout ce que vous avez à faire est parcourir la liste jusqu'à ce que vous trouviez l'élément que vous recherchez.
Une structure de données cartographiques et une "collision" ne peuvent pas être séparées. la façon dont vous avez commencé votre implémentation semble bien, voici comment vous devez gérer les collisions:
Ajout d'une nouvelle entrée dans la carte
- calculate
hashcode
pourkey
- Compute
index
de hashcode (plus ou moinsindex
=hashcode value
%size of keyset
) - si
keyset[index]
est non nulle- si keyset [index]! = Touche (c.-à-d. pour les chaînes, l'utilisation strcmp) incrémenter
index
modulesize of keyset
, puis goto 3
- si keyset [index]! = Touche (c.-à-d. pour les chaînes, l'utilisation strcmp) incrémenter
- mis
value
enentryset[index]
Obtenir une valeur de la carte
- calculate
hashcode
pourkey
- calculer
index
à partir de h ashcode (plus ou moinsindex
=hashcode value
%size of keyset
) - si
keyset[index]
est non nul- si keyset [index]! = clé (ie.pour les chaînes, l'utilisation strcmp) incrémenter
index
modulesize of keyset
, puis goto 3
- si keyset [index]! = clé (ie.pour les chaînes, l'utilisation strcmp) incrémenter
- si
keyset[index]
est null return null - retour
entryset[index]
Suppression d'une entrée de la carte
- calculer
hashcode
pourkey
- Compute
index
de hashcode (plus ou moinsindex
=hashcode value
%size of keyset
) - si
keyset[index]
est non nul- si keyset [index]! = Clé (ie. pour les chaînes, l'utilisation strcmp) incrémenter
index
modulesize of keyset
, puis goto 3
- si keyset [index]! = Clé (ie. pour les chaînes, l'utilisation strcmp) incrémenter
- mis
keyset[index]
etentryset[index]
null
Comme vous pouvez le voir, vous pouvez mettre l'étape 1 à 3 en fonction int findIndexFromKey(Map *map, char *key);
et plus du travail est fait
** EDIT **
Bien sûr, vous devez également vérifier si votre m ap n'est pas complet avant (ou pendant) l'ajout d'une nouvelle entrée, sinon vous ne bouclerez pas indéfiniment.
- 1. Comment convertir Map <String, String> en Map <Long, String> en utilisant goyave
- 2. Lire un fichier complexe à paire <string, paire <map <string, string> string>> C++
- 3. Java Jackson JSON parse dans Map <String, String>
- 4. Est-ce une structure de données valide Map <string, string, string> en C++?
- 5. Inverser un HashMap de Map <String, Boolean> vers Map <Boolean, Liste <String>>
- 6. AutoMapper Map KeyValuePair <String, String> à Classer?
- 7. La méthode renderJSON (Map <String, String>) est indéfinie
- 8. Impossible de transformer un HashMap <String, String> en une extension de l'interface Map <String, String>
- 9. Comment créer un objet JSON à partir de ArayList <Map <String, String >>?
- 10. Comment obtenir une valeur de la carte java: Map <String, ArrayList <String>>?
- 11. problème comptage dans Map <String, Entier>
- 12. Mapping Map <String,Foo> dans Hibernate
- 13. Parsing JSON dans Map <String, entité> avec FlexJSON
- 14. Pliez de Map [String, List [Int]] à Map [String, Int]
- 15. Collections et commande naturelle d'une carte <Long, Map <String, String >>
- 16. Comment analyser le dictionnaire <string, string> dans C#
- 17. ServletRequest.getParameterMap() renvoie Map <String, String []> et ServletRequest.getParameter() renvoie String?
- 18. Pouvons-nous avoir une structure de données comme map <string, pair <string,list>>?
- 19. comment envelopper, retourner et obtenir l'objet du vecteur <map <string, string>> dans la version C++ de la bibliothèque xmlrpc-c?
- 20. increment map <string, int> en utilisant l'opérateur ++
- 21. Comment mapper 2 tableaux char * directement dans std :: map <std :: string, std :: string>
- 22. `auto-increment` std :: map <string, int> :)
- 23. comment obtenir string [] de carte <String, string>
- 24. Java implémentant la classe Map <String, String> et l'utilisation de l'itérateur
- 25. Carte JPA <String, String []> Mappage
- 26. Obtenir les 3 valeurs les plus élevées de Map <String, String>
- 27. maréchal Carte <String, String> .xml
- 28. Passe une carte <String, String> à une méthode nécessitant carte <String, Object>
- 29. C++: push_back une carte <string, int> en un vecteur <map <string, int>> via un itérator?
- 30. Carte <String, String> avec JPA
Votre boucle dans "ajouter une nouvelle entrée" ne se terminera jamais si la même clé a déjà été ajoutée. –
vrai, je le répare maintenant. Bien que l'idée générale soit là –
Votre fonction de suppression est également incorrecte - si vous ajoutez 'key1' suivi de' key2' qui ont le même hachage, alors supprimez 'key1',' key2' est perdu (ne sera pas trouvé par le fonction "get"). – caf