長さ 100 文字の文字列の膨大なリスト (N = ~100 万) があり、それらの間の重複を見つけようとしています。たとえば、1 つの文字列は次のようになります。
XXXXXXXXXXXXXXXXXXAACTGCXAACTGGAAXA (and so on)
すべての文字列と他のすべての文字列の最長重複値を含む N 行 N 列の行列を作成する必要があります。私の現在の方法は(疑似コード)です
すべての文字列を配列に読み込む
空の NxN 行列を作成する
各文字列をより高い配列インデックスを持つすべての文字列と比較します (比較のやり直しを避けるため)
最長オーバーラップを行列に書き込む
他にも多くのことが行われていますが、マトリックスを構築するためのより効率的な方法が本当に必要です。最も強力なコンピューティング クラスターを使用しても、この方法を手に入れるには数日かかります。
ご想像のとおり、これらは DNA フラグメントです。X は「ワイルドカード」 (しきい値の品質スコアを下回るプローブ) を示し、他のすべてのオプションは塩基 (A、C、T、または G) です。四分木アルゴリズムを書き込もうとしましたが、この方法はメモリを大量に消費します。
より効率的な方法についてご提案いただければ幸いです。私は C++ で作業していますが、疑似コード/アイデアまたは他の言語コードも非常に役立ちます。
編集:私の現在の方法を説明するいくつかのコードの抜粋。コンセプトに特に関係のないものはすべて削除されました
//part that compares them all to each other
for (int j=0; j<counter; j++) //counter holds # of DNA
for (int k=j+1; k<counter; k++)
int test = determineBestOverlap(DNArray[j],DNArray[k]);
//boring stuff
//part that compares strings. Definitely very inefficient,
//although I think the sheer number of comparisons is the main problem
int determineBestOverlap(string str1, string str2)
{
int maxCounter = 0, bestOffset = 0;
//basically just tries overlapping the strings every possible way
for (int j=0; j<str2.length(); j++)
{
int counter = 0, offset = 0;
while (str1[offset] == str2[j+offset] && str1[offset] != 'X')
{
counter++;
offset++;
}
if (counter > maxCounter)
{
maxCounter = counter;
bestOffset = j;
}
}
return maxCounter;
} //this simplified version doesn't account for flipped strings