- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个巨大的列表(N = ~100 万),其中包含 100 个字符长的字符串,我试图找出它们之间的重叠部分。例如,一个字符串可能是
XXXXXXXXXXXXXXXXXXAACTGCXAACTGGAAXA (and so on)
我需要构建一个 N × N 矩阵,其中包含每个字符串与其他每个字符串的最长重叠值。我现在的方法是(伪代码)
read in all strings to array
create empty NxN matrix
compare each string to every string with a higher array index (to avoid redoing comparisons)
Write longest overlap to matrix
还有很多其他事情要做,但我确实需要一种更有效的方法来构建矩阵。即使使用最强大的计算集群,我也需要几天时间才能掌握这种方法。
如果您没有猜到,这些是 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
最佳答案
你真的需要知道所有字符串对之间的匹配吗?如果是,那么您将不得不将每个字符串与其他每个字符串进行比较,这意味着您将需要进行 n^2/2 次比较,并且即使您只为每个字符串对存储一个字节,您也将需要半 TB 的内存。
但是,我假设您真正感兴趣的是长字符串,那些有超过 20 个或 30 个甚至超过 80 个共同字符的字符串,您可能真的不想知道两个字符串是否对有 3 个字符相同,另外 50 个是 X,其余 47 个不匹配。
如果我是你,我会尝试什么——仍然不知道这是否适合你的应用——是:
1) 从每个字符串中,提取有意义的最大子字符串。我想您想完全忽略开头和结尾处的“X”,如果某些“可读”部分被大量“X”破坏,则单独处理可读部分而不是使用更长的字符串。很多这样的“哪些子串是相关的?”取决于你的数据和应用程序,我真的不知道。
2) 列出这些最长的子串,以及每个子串出现的次数。按字符串长度排序此列表。您可以但实际上不必将每个原始字符串的索引与子字符串一起存储。你会得到类似(示例)的东西
AGCGCTXATCG 1
GAGXTGACCTG 2
.....
CGCXTATC 1
......
3) 现在,从列表的顶部到底部:
a) 将“当前字符串”设置为列表顶部的字符串。
b) 如果当前字符串旁边的出现次数 > 1,则您找到了匹配项。如果您不记得索引,请在原始字符串中搜索子字符串,并标记匹配项。
c) 将当前字符串与所有相同长度的字符串进行比较,以找到某些字符为 X 的匹配项。
d) 从当前字符串中删除第一个字符。如果结果字符串已经在您的表中,则将其出现次数计数器加一,否则将其输入表中。
e) 从当前字符串中删除最后一个而不是第一个字符,重复 3b。
f) 从列表中删除当前字符串。
g) 从 3a) 开始重复,直到计算时间用完,或者剩余的字符串变得太短而不有趣。
这是否是一个更好的算法在很大程度上取决于您的数据以及您真正感兴趣的比较。如果您的数据非常随机/您的匹配项很少,它可能需要比您最初的想法更长的时间。但它可能会让您首先找到有趣的部分,并跳过不那么有趣的部分。
关于c++ - 提高字符串重叠矩阵构建效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22133576/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!