2013-04-28 4 views
6

このタスクでは、ハミング距離を取得する必要があります(同じ長さの2つの文字列間のハミング距離は、対応するシンボルが異なる位置の数です - Wikipediaから) 2つの文字列sequence1とsequence2の間。forループを使用して2つの文字列の間のハミング距離を取得する

まず2つの新しい文字列を作成しましたが、これは2つの元の文字列ですが、どちらも比較を簡単にするために小文字を使用しています。その後、私はforループを使い、2つの文字列を比較することにしました。これらの2対の文字列の文字の違いについては、ループはint x = 0に1を加えます。メソッドの戻り値はこの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; 
} 

コードは十分に機能しているようですか?私が修正したり、コードを最適化できるものは何ですか?前もって感謝します。私は何か愚かなことを尋ねるなら私は大げさな奴ですので

+0

「修正することができるもの」は、ここに属する質問です。 'optimize'質問はコードレビューに属します –

+0

この質問はhttp://codereview.stackexchange.com/に適しています。そこにはより良い回答が得られます。 – jpaugh

+0

はこの宿題ですか? –

答えて

3

あなたのコードは完全にオフです。 あなたが言ったように、距離は文字列が異なる場所の数です - したがって、両方の文字列を一度に処理するループが1つだけ必要です。代わりに、文字列aのすべてのインデックスと文字列bのすべてのインデックスを比較するネストされた2つのループがあります。

また、結果がa+=0のif条件を記述するのは時間の無駄です。

代わりにこれを試してみてください。

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()を使用して文字列からchar配列を取得し、この配列で作業します。これはより読みやすく、効果的です。
  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

少ないコードバグも少ない...

編集:としてあなたはif/elseの構造を全く必要としません:0aを追加することは冗長です。

+0

"文字列のcharAt()を使用しないでください。ループの前にtoCharArray()を使用して文字列から文字配列を取得してからこの配列を処理してください。ジャストインタイムコンパイルをしていますか?私は自分でそれをテストしていないことを意味しますが、私はcharAtが最適化されてしまうと思います。 –

5

私のポイントから次の実装が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; 
} 
  1. を比較する必要がある各単一文字のための2つの方法(のcharAt)の呼び出しを回避するものアレイを使用して、
  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; 
} 
関連する問題