6
votes

Utilisation de la boucle pour obtenir la distance de Hamming entre 2 cordes

Dans cette tâche, j'ai besoin d'obtenir la distance de hammage (la distance de hamming entre deux chaînes de longueur égale est le nombre de positions à laquelle les symboles correspondants sont différents - de Wikipedia) entre la séquence de deux chaînes1 et la séquence2.

Tout d'abord, j'ai fait 2 nouvelles chaînes qui sont les 2 cordes originales, mais les deux avec un boîtier abaissé pour rendre la comparaison plus facile. Ensuite, j'ai eu recours à la boucle pour la boucle et si pour comparer les 2 cordes. Pour toute différence de caractères dans ces 2 paires de chaîne, la boucle ajouterait 1 à un int x = 0. Les retours de la méthode seront la valeur de ce x. P>

public static int getHammingDistance(String sequence1, String sequence2) {
    int a = 0;
    String sequenceX = sequence1.toLowerCase();
    String sequenceY = sequence2.toLowerCase();
    for (int x = 0; x < sequenceX.length(); x++) {
        for (int y = 0; y < sequenceY.length(); y++) {
            if (sequenceX.charAt(x) == sequenceY.charAt(y)) {
                a += 0;
            } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) {
                a += 1;
            }
        }
    }
    return a;
}


5 commentaires

tout ce que je pouvais faire pour corriger est une question qui appartient ici. optimiser question appartient au code de code


Cette question est mieux adaptée à codereview.stackexchange.com . Vous obtiendrez aussi des réponses plus agréables.


De plus, votre code n'émet pas une réponse correcte. J'ai testé avec ABCD et ABDD, la sortie est 12


Avez-vous regardé la distance de Levenshtein? Il y a beaucoup de bibliothèques qui font cela, y compris Apache Commons


@isti_spl Notez que l'étiquette de devoirs a été désolved: meta.stackexchange.com/questions/147100/...


4 Réponses :


3
votes

Votre code est complètement éteint. Comme vous l'avez dit, la distance est le nombre d'endroits où les chaînes diffèrent - vous ne devez donc avoir 1 boucle que sur les deux cordes à la fois. Au lieu de cela, vous avez 2 boucles imbriquées qui comparent chaque index dans la chaîne A à chaque index de la chaîne b.

En outre, écrivez une condition IF résultant en A + = 0 code> est une perte de temps. p>

Essayez cela à la place: P>

for (int x = 0; x < sequenceX.length(); x++) { //both are of the same length
    if (sequenceX.charAt(x) != sequenceY.charAt(x)) {
        a += 1;
    }
}


1 commentaires

Merci pour l'aide. Dans le cadre du problème, il fera très bien le travail. Merci encore: D



0
votes

Votre code est correct, mais je vous suggère des améliorations suivantes.

  1. N'utilisez pas charat () code> de chaîne. Obtenez de la grincement de la chaîne à l'aide de TOCHARARRAY () CODE> Avant de boucle, puis travaillez avec ce tableau. Ceci est plus lisible et plus efficace. LI>
  2. la structure p>

        if (sequenceX.charAt(x) == sequenceY.charAt(y)) {
            a += 0;
        } else if (sequenceX.charAt(x) != sequenceY.charAt(y)) {
            a += 1;
        }
    


1 commentaires

"N'utilisez pas de charret () de la chaîne. Obtenez une matrice de charret à partir de la chaîne à l'aide de TOCHARARRAY () Avant de boucler, puis travaillez avec ce tableau. Ceci est plus lisible et plus efficace" -> Est-ce vraiment important quand vous avez juste Compilation de temps? Je veux dire que je ne l'ai pas testé par moi-même, mais j'imagine que le charat serait optimisé.



5
votes

de mon point que la mise en œuvre suivante serait OK:

public static int getHammingDistance(String sequence1, String sequence2) {
    char[] s1 = sequence1.toCharArray();
    char[] s2 = sequence2.toCharArray();

    int shorter = Math.min(s1.length, s2.length);
    int longest = Math.max(s1.length, s2.length);

    int result = 0;
    for (int i=0; i<shorter; i++) {
        if (s1[i] != s2[i]) result++;
    }

    result += longest - shorter;

    return result;
}


0 commentaires

1
votes
public static int getHammingDistance(String sequenceX, String sequenceY) {
    int a = 0;
   // String sequenceX = sequence1.toLowerCase();
    //String sequenceY = sequence2.toLowerCase();
    if (sequenceX.length() != sequenceY.length()) {
        return -1; //input strings should be of equal length
    }

    for (int i = 0; i < sequenceX.length(); i++) {
        if (sequenceX.charAt(i) != sequenceY.charAt(i)) {
            a++;
        }
    }
    return a;
}

0 commentaires