我有一个巨大的字符串列表(N = ~100 万),长度为 100 个字符,我试图找到它们之间的重叠。例如,一个字符串可能是
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