En ce qui concerne l'exemple dans le tutoriel en ligne java d'Oracle qui utilise HashMap pour stocker l'anagramme


Je lisais l'exemple dans le tutoriel java en ligne d'Oracle qui utilise HashMap pour stocker des anagrammes:

    // Read words from file and put into a simulated multimap
    Map<String, List<String>> m = new HashMap<String, List<String>>();

    try {
        Scanner s = new Scanner(new File(args[0]));
        while (s.hasNext()) {
            String word = s.next();
            String alpha = alphabetize(word);
            List<String> l = m.get(alpha);
            if (l == null)
                m.put(alpha, l=new ArrayList<String>());
            l.add(word);
        }
    } catch (IOException e) {
        System.err.println(e);
        System.exit(1);
    }

    // Print all permutation groups above size threshold
    for (List<String> l : m.values())
        if (l.size() >= minGroupSize)
            System.out.println(l.size() + ": " + l);
}

private static String alphabetize(String s) {
    char[] a = s.toCharArray();
    Arrays.sort(a);
    return new String(a);
}

}

Puisque HashMap est implémenté avec la table de hachage, je pense que chaque chaîne alphabétique triée devrait avoir un code de hachage unique après compression(sinon la liste chaînée qui stocke les valeurs dans HashMap stockera une valeur qui n'est pas une anagramme de la chaîne alphabétique triée).

Je ne sais pas exactement comment l'implémentation de Java de HashMap peut satisfaire cela-je suppose qu'ils utilisent le code de hachage d'une chaîne (a1*31^n-1 + a2*31^n-2 + ... + un). Cela pourrait garantir l'unicité du code de hachage, si nous parlons de chaînes avec uniquement les minuscules caractères. Cependant, il faut également compresser le code de hachage avant de mettre la valeur de la clé dans le compartiment dans la table de hachage (sinon vous auriez une table de hachage hugggggge qui ne peut pas être gérée en mémoire, juste en pensant à la taille de 31^10). Parmi cette compression, je pense qu'il y aura collision. En d'autres termes, deux chaînes différentes qui ne sont pas de vrais anagrammes finiront par être stockées dans le même compartiment (qui ne devrait être utilisé que pour stocker une liste de vrais anagrammes)...

Quelqu'un pourrait-il m'aider à comprendre ce qui pourrait me manquer? Ou si le tutoriel en ligne manque quelque chose?

Merci!

Jason

Author: Eric H., 2012-11-26

1 answers

Ne supposez jamais que les codes de hachage sont uniques but mais réalisez que HashMap sait déjà que les codes de hachage ne sont pas uniques et les traite de manière appropriée.

En d'autres termes, même si les a.hashCode() == b.hashCode() si !a.equals(b), puis HashMap ne se marient pas jusqu'à la valeur associée à a et la valeur associée à b.

 1
Author: Louis Wasserman, 2012-11-26 21:08:46