2013-04-28 2 views
6

В этой задаче мне нужно получить расстояние Хэмминга (расстояние Хэмминга между двумя строками равной длины - это количество позиций, в которых соответствующие символы различны - из Википедии) между двумя последовательностями последовательности 1 и последовательностью2.Использование для цикла, чтобы получить расстояние Хэмминга между двумя строками

Сначала я сделал 2 новые строки, которые являются 2 исходными строками, но оба с опущенным футляром, чтобы упростить сравнение. Затем я прибегал к использованию цикла for и если сравнивать 2 строки. Для любых различий в символах в этих двух парах строки цикл добавит 1 к int x = 0. Возврат метода будет значением этого 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; 
} 

Значит, код выглядит неплохо и функционально? Что-нибудь я мог исправить или оптимизировать код? Заранее спасибо. Я огромный noob, так простите меня, если я попрошу что-нибудь глупое

+0

«Все, что я могу сделать, чтобы исправить» - вопрос, который здесь принадлежит. 'optimize' question принадлежит Code-Review –

+0

Этот вопрос лучше подходит для http://codereview.stackexchange.com/. Там вы получите более приятные ответы. – jpaugh

+0

Это домашнее задание? –

ответ

3

ваш код полностью выключен. , как вы сами сказали, расстояние - это количество мест, где строки отличаются - так что вы должны иметь только 1 цикл, переходя сразу по обеим строкам. вместо этого у вас есть 2 вложенных цикла, которые сравнивают каждый индекс в строке a с каждым индексом в строке b.

также, записывая условие if, которое приводит к a+=0, является пустой тратой времени.

попробуйте вместо этого:

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

также, это еще Наивный подход, который будет probbaly не работать со сложными символами Unicode (где 2 символа может быть логически равно еще не имеет один и тот же код символа)

+0

Спасибо за помощь. В рамках проблемы он будет выполнять эту работу в полном порядке. Еще раз спасибо: D – Doh

0

Ваш код в порядке, однако я предлагаю вам следующие улучшения.

  1. не использовать charAt() строки. Получите массив символов из строки, используя toCharArray() перед циклом, а затем с этим массивом. Это более читаемо и более эффективно.
  2. Структура

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

    выглядит излишним. Исправьте это: if (sequenceX.charAt (x) == sequenceY.charAt (y)) { a + = 0; } else { a + = 1; }

Кроме того, принимая во внимание, что я рекомендовал вам работать с массивом изменить его на что-то вроде:

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

меньше кода меньше ошибок ...

EDIT: в качестве упоминается @radai, вам не нужна структура if/else: добавление 0 в a избыточно.

+0

«Не используйте charAt() из строки. Получите массив символов из строки, используя toCharArray() перед циклом, а затем с этим массивом. Это более читаемо и более эффективно» -> Действительно ли это имеет значение, когда вы есть своевременная компиляция? Я имею в виду, что я не тестировал его сам, но я думаю, что charAt будет оптимизирован. –

5

С моей точкой следующей реализацией будет нормально:

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. использует массив, то, что позволяет избежать вызова два методы (Шар) для каждого отдельного полукокса, который должен быть сравнен;
  2. избегать исключения, когда одна строка длиннее другой.
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; 
} 
Смежные вопросы