3

これはおそらく少しばかげた質問のように思えます..そして多分そうです。しかし、私は非常に頻繁に使用する関数を持っており、これが仕事をするための最速の方法であるかどうかについて意見を求めていました。この関数は非常に頻繁に使用されるため、速度の増加は実際には顕著です。文字がヌクレオチドであるかどうかをチェックするだけです (つまり、文字が「A」、「T」、「C」、または「G」であるかどうか)。

private static boolean isValidNucleotide(char nucleotide) {
    nucleotide = Character.toUpperCase(nucleotide);
    if(nucleotide == 'A') return true; 
    if(nucleotide == 'T') return true;
    if(nucleotide == 'C') return true;
    if(nucleotide == 'G') return true;
    return false;
}

これは仕事を達成するための最速の方法ですか?それとも、ある種のインデックス/マップ/何か他のものを実装する価値があると思いますか (おそらく関数の外で比較を実行し、このテキストをコードのいくつかの場所にコピーするだけです)? 私はJavaのこの種のことの専門家ではありません。

4

4 に答える 4

5

最も高速な (ただし、メモリ効率は最も低くても 255 バイトは悪くありません!) は次のようになります。

/* this is static member of class */
static boolean map[] = new boolean[256];
static {
    for(int j = 0; j < map.length; j++)
        map[j] = false;
    /* map your required values true here */ 
    map['A'] = true;
    map['T'] = true;
    map['C'] = true;
    map['G'] = true;
    /* make small letter here too */
    map['a'] = true;
    map['t'] = true;
    map['c'] = true;
    map['g'] = true;
}

次に、次のような関数を作成します。

private static boolean isValidNucleotide(char nucleotide) {
    /* complexity is just one access to array */
    return map[nucleotide];
}

@paxdiabloが言ったように、Java charは1バイトではなく2バイトですが、文字はこの範囲内にあります。に変更return map[nucleotide];するだけで動作するreturn map[0x00ff & nucleotide];はずです。

マップのサイズを変更65536して安全を確保し、あらゆる種類のエラーを回避することもできます。boolean map = new boolean[65536]

于 2013-02-20T02:42:03.630 に答える
3

switch-case通常、小さなスイッチのテーブル ルックアップとして実装されている を試すことができます。

switch(nucleotide) {
case 'A':
case 'T':
case 'C':
case 'G':
    return true;
}
return false;

JVM の JIT は、if頻繁に呼び出される場合、ベースのコードをかなり高速にすることに注意してください。

于 2013-02-20T02:30:04.380 に答える
1

大文字と小文字Character.toUpperCaseの両方を削除してチェックすると、関数が大幅に高速化されます。

private static boolean isValidNucleotide(char nucleotide) {       
    if(nucleotide == 'A' || nucleotide == 'a') return true; 
    // Rest of your conditions

    return false;
}

元の関数を使用して小さなテストを行いましたが、平均80 msして実行に時間がかかりまし10000000 timesたが、削除Character.toUpperCase()して両方のケースを明示的にチェックしたところ40 ms、大幅な改善が見られました。

編集:

Map@Shivam Kalraによって提案されたソリューションを使用すると、11 ms平均してかかりました!

于 2013-02-20T02:37:32.757 に答える
-1

試したことはありませんが、正規表現を使用してパフォーマンスを確認できます

于 2013-02-20T02:37:51.987 に答える