2

次の問題があります。

巨大なif-cascadeを作成できることはわかっていますが、それは見苦しくて保守が難しいだけでなく、遅いと思います。

それを実装するための高速で簡単に維持できる方法は何ですか? おそらくある種のルックアップテーブル、または組み合わせのマトリックスですか?コードサンプルは大歓迎です。私はBiojavaを使用していたでしょうが、私がすでに使用している現在のバージョンはその機能を提供していません(またはまだ見つけていません...)。

更新: ここには少し混乱があるようです。コンセンサス記号は単一の文字であり、両方のシーケンスで単一の文字を表します。

String1 と String2 は、たとえば "ACGT" と "ACCT" です。位置 2 が一致しません。S は「C または G のいずれか」を表すため、コンセンサス文字列を ACST にしたいのです。

次のようなメソッドを作りたいです。

char getConsensus(char a, char b)

更新 2 : 提案された方法のいくつかは、シーケンスが 2 つしかない場合に機能します。これらの「同意」を何度か繰り返す必要があるかもしれないので、入力アルファベットが「ACGT」から「ACGTRYKMSWBDHVN」に増加する可能性があり、提案されたアプローチのいくつかを作成して維持するのが非常に扱いにくくなります。

4

6 に答える 6

2

シンプルで高速なソリューションは、ビットごとの OR を使用することです。

起動時に、2 つのテーブルを初期化します。

  • ヌクレオチドを単一ビットにマッピングするための 128 要素のスパース テーブル。「スパース」とは、使用するメンバー (大文字と小文字の IUPAC コード) のみを設定する必要があることを意味します。
  • ビット単位のコンセンサスを IUPAC ヌクレオチド コードにマッピングする 16 要素のテーブル。

単一の立場についてコンセンサスを得るには:

  1. 最初のテーブルでヌクレオチドをインデックスとして使用して、ビット単位の表現を取得します。
  2. ビット単位表現のビット論理和。
  3. ビットごとの OR を 16 要素テーブルへのインデックスとして使用します。

開始するための単純なビット単位の表現を次に示します。

    private static final int A = 1 << 3;
    private static final int C = 1 << 2;
    private static final int G = 1 << 1;
    private static final int T = 1 << 0; 

最初のテーブルのメンバーを次のように設定します。

    characterToBitwiseTable[ 'd' ] = A | G | T;
    characterToBitwiseTable[ 'D' ] = A | G | T;

2 番目のテーブルのメンバーを次のように設定します。

    bitwiseToCharacterTable[ A | G | T ] = 'd';
于 2011-12-21T15:50:12.017 に答える
2

HashMap<String, String>競合/相違点をコンセンサス シンボルにマップする a を使用できます。「ハードコード」(アプリのコードを入力) するか、アプリの起動時に外部ソース (ファイル、データベースなど) からコードを入力することができます。次に、違いがあるときはいつでもそれを使用します。

String consensusSymbol = consensusMap.get(differenceString);

EDIT:あなたのAPIリクエストに対応するために;]

Map<String, Character> consensusMap; // let's assume this is filled somewhere
...
char getConsensus(char a, char b) {
    return consensusMap.get("" + a + b);
}

私はこれが大雑把に見えることを理解していますが、あなたは要点を理解していると思います. これは、ルックアップ テーブルよりもわずかに遅くなる可能性がありますが、維持するのもはるかに簡単です。

まだ別の編集:

本当に超高速なものが必要で、実際にchar型を使用する場合は、2d テーブルを作成して文字でインデックスを付けることができます (数字として解釈されるため)。

char lookup[][] = new char[256][256]; // all "english" letters will be below 256
//... fill it... e. g. lookup['A']['C'] = 'M';
char consensus = lookup['A']['C'];
于 2011-12-21T13:30:49.143 に答える
0

biostar.stackexchange.comからの少しの入力で、 pablochanに触発された列挙型を使用した可能な解決策:

enum lut {
     AA('A'), AC('M'), AG('R'), AT('W'), AR('R'), AY('H'), AK('D'), AM('M'), AS('V'), AW('W'), AB('N'), AD('D'), AH('H'), AV('V'), AN('N'),
     CA('M'), CC('C'), CG('S'), CT('Y'), CR('V'), CY('Y'), CK('B'), CM('M'), CS('S'), CW('H'), CB('B'), CD('N'), CH('H'), CV('V'), CN('N'),
     GA('R'), GC('S'), GG('G'), GT('K'), GR('R'), GY('B'), GK('K'), GM('V'), GS('S'), GW('D'), GB('B'), GD('D'), GH('N'), GV('V'), GN('N'),
     TA('W'), TC('Y'), TG('K'), TT('T'), TR('D'), TY('Y'), TK('K'), TM('H'), TS('B'), TW('W'), TB('B'), TD('D'), TH('H'), TV('N'), TN('N'),
     RA('R'), RC('V'), RG('R'), RT('D'), RR('R'), RY('N'), RK('D'), RM('V'), RS('V'), RW('D'), RB('N'), RD('D'), RH('N'), RV('V'), RN('N'),
     YA('H'), YC('Y'), YG('B'), YT('Y'), YR('N'), YY('Y'), YK('B'), YM('H'), YS('B'), YW('H'), YB('B'), YD('N'), YH('H'), YV('N'), YN('N'),
     KA('D'), KC('B'), KG('K'), KT('K'), KR('D'), KY('B'), KK('K'), KM('N'), KS('B'), KW('D'), KB('B'), KD('D'), KH('N'), KV('N'), KN('N'),
     MA('M'), MC('M'), MG('V'), MT('H'), MR('V'), MY('H'), MK('N'), MM('M'), MS('V'), MW('H'), MB('N'), MD('N'), MH('H'), MV('V'), MN('N'),
     SA('V'), SC('S'), SG('S'), ST('B'), SR('V'), SY('B'), SK('B'), SM('V'), SS('S'), SW('N'), SB('B'), SD('N'), SH('N'), SV('V'), SN('N'),
     WA('W'), WC('H'), WG('D'), WT('W'), WR('D'), WY('H'), WK('D'), WM('H'), WS('N'), WW('W'), WB('N'), WD('D'), WH('H'), WV('N'), WN('N'), 
     BA('N'), BC('B'), BG('B'), BT('B'), BR('N'), BY('B'), BK('B'), BM('N'), BS('B'), BW('N'), BB('B'), BD('N'), BH('N'), BV('N'), BN('N'),
     DA('D'), DC('N'), DG('D'), DT('D'), DR('D'), DY('N'), DK('D'), DM('N'), DS('N'), DW('D'), DB('N'), DD('D'), DH('N'), DV('N'), DN('N'),
     HA('H'), HC('H'), HG('N'), HT('H'), HR('N'), HY('H'), HK('N'), HM('H'), HS('N'), HW('H'), HB('N'), HD('N'), HH('H'), HV('N'), HN('N'),
     VA('V'), VC('V'), VG('V'), VT('N'), VR('V'), VY('N'), VK('N'), VM('V'), VS('V'), VW('N'), VB('N'), VD('N'), VH('N'), VV('V'), VN('N'),
     NA('N'), NC('N'), NG('N'), NT('N'), NR('N'), NY('N'), NK('N'), NM('N'), NS('N'), NW('N'), NB('N'), ND('N'), NH('N'), NV('N'), NN('N');

     char consensusChar = 'X';

     lut(char c) {
         consensusChar = c;
     }

     char getConsensusChar() {
         return consensusChar;
     }
}

char getConsensus(char a, char b) {
    return lut.valueOf("" + a + b).getConsensusChar();
}
于 2011-12-22T08:03:47.503 に答える
0

Considered reading multiple sequences at once - I would:

  1. put all characters from the same position in the sequence to a set
  2. sort and concatenate values in the set and use enum.valueOf() as in fge's example
  3. acquired value use as a key to a EnumMap having consesus symbols as a values

There are probably ways hot o optimize the second and the first steps.

于 2011-12-21T14:31:38.677 に答える
0

可能な組み合わせは約 20 です。したがって、実際のパフォーマンスの問題はありません。大きな if else ブロックを実行したくない場合、最も速い解決策は Tree データ構造を構築することです。http://en.wikipedia.org/wiki/Tree_data_structure。これは、やりたいことを実行するための最速の方法です。

ツリーでは、可能なすべての組み合わせを配置し、文字列を入力すると、ツリーを走査してシンボルの最長一致シーケンスを見つけます

図示された例が欲しいですか?

PS : すべての人工知能ソフトウェアは、最も高速で最も適応性の高いツリー アプローチを使用します。

于 2011-12-21T13:15:49.603 に答える
0

それらがすべて一意のシンボルであることを考えると、次のようになりますEnum

public Enum ConsensusSymbol
{
    A("A"), // simple case
    // ....
    GTUC("B"),
    // etc
    // last entry:
    AGCTU("N");

    // Not sure what X means?

    private final String symbol;

    ConsensusSymbol(final String symbol)
    {
        this.symbol = symbol;
    }

    public String getSymbol()
    {
        return symbol;
    }
}

次に、違いが発生した場合は、次を使用します.valueOf()

final ConsensusSymbol symbol;

try {
    symbol = ConsensusSymbol.valueOf("THESEQUENCE");
} catch (IllegalArgumentException e) { // Unknown sequence
    // TODO
}

たとえばGTUC、文字列として遭遇した場合、 は列挙値Enum.valueOf("GTUC")を返し、その値を呼び出すと が返されます。GTUCgetSymbol()"B"

于 2011-12-21T13:16:42.397 に答える