2013-04-28 9 views
6

In questo compito ho bisogno di ottenere la distanza di Hamming (la distanza di Hamming tra due stringhe di uguale lunghezza è il numero di posizioni in cui i simboli corrispondenti sono diversi - da Wikipedia) tra le due stringhe sequenza1 e sequenza2.Utilizzo per loop per ottenere la distanza di Hamming tra 2 stringhe

Per prima cosa ho creato 2 nuove stringhe che sono le 2 stringhe originali ma entrambe con case abbassate per facilitare il confronto. Quindi ho fatto ricorso al ciclo for e a confrontare le 2 stringhe. Per eventuali differenze nei caratteri in queste 2 coppie di stringhe, il ciclo aggiungerebbe 1 a un int x = 0. I ritorni del metodo saranno il valore di questa x.

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; 
} 

Quindi il codice sembra buono e abbastanza funzionale? Qualche cosa che potrei risolvere o ottimizzare il codice? Grazie in anticipo. Sono un grande noob, quindi scusami se ho chiesto qualcosa di stupido

+0

'niente che potessi fare per fix' è una domanda che appartiene qui. La domanda 'optimize' appartiene a Code-Review –

+0

Questa domanda è più adatta a http://codereview.stackexchange.com/. Riceverai anche risposte migliori. – jpaugh

+0

è questo compito? –

risposta

3

il tuo codice è completamente spento. come hai detto tu stesso, la distanza è il numero di posti in cui le stringhe differiscono - quindi dovresti avere solo un ciclo, andando su entrambe le stringhe contemporaneamente. invece si hanno 2 cicli annidati che confrontano ogni indice nella stringa a in ogni indice della stringa b.

inoltre, la scrittura di una condizione if che risulta in a+=0 è una perdita di tempo.

provare questo invece:

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

anche, questo è ancora un approccio ingenuo che non probbaly funziona con i caratteri Unicode complesse (dove 2 personaggi possono essere logicamente uguale ma non hanno lo stesso codice di carattere)

+0

Grazie per l'aiuto. Nell'ambito del problema, farà bene il lavoro. Grazie ancora: D – Doh

0

Il tuo codice è OK, tuttavia ti suggerisco i seguenti miglioramenti.

  1. non utilizzare charAt() di stringa. Ottieni il char array da una stringa usando toCharArray() prima del ciclo e poi lavora con questo array. Questo è più leggibile e più efficace.
  2. La struttura

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

    sembra ridondante. Risolvilo a: if (sequenceX.charAt (x) == sequenceY.charAt (y)) { a + = 0; } else { a + = 1; }

Inoltre tenendo conto che ho raccomandato di lavorare con array di cambiarlo a qualcosa di simile:

a += seqx[x] == seqY[x] ? 0 : 1

meno codice meno bug ...

EDIT: come menzionato da @radai non è necessaria la struttura if/else: l'aggiunta di 0 a a è ridondante.

+0

"non usare charAt() di stringa Ottieni l'array di caratteri dalla stringa usando toCharArray() prima del ciclo e quindi lavora con questo array.Questo è più leggibile e più efficace" -> È veramente importante quando hai una compilazione just-in-time? Voglio dire, non l'ho provato da solo, ma immagino che il charAt sia ottimizzato. –

5

Dal mio punto seguente attuazione sarebbe male:

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; 
} 
  1. utilizza matrice, ciò evita l'invocazione di due metodo (charAt) per ogni singolo carattere che deve essere confrontato;
  2. evitare l'eccezione quando una stringa è più lunga dell'altra.
1
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; 
}