我必须用C#形式做一个程序,它必须从一个看起来像这样的文件加载:
100ACTGGCTTACACTAATCAAG
101TTAAGGCACAGAAGTTTCCA
102ATGGTATAAACCAGAAGTCT
。
120GCATCAGTACGTACCCGTAC
由数字 (ID) 和 20 个字母 (ADN) 组成的 20 行;另一个文件如下所示:
TGCAACGTGTACTATGGACC
简而言之,这是一个谋杀的游戏,有20个人; 我必须加载和拆分字母,并且......我必须比较它们,最后我必须找到最佳匹配。我不知道该怎么做,我不知道如何在数组中加载字母然后拆分它们。然后比较它们。
你在这里要做的是使用类似计算字符串之间 Levenshtein 距离的东西。
简单来说,这提供了您必须更改多少个单个字母才能使字符串等于另一个字符串的计数。在DNA或蛋白质的背景下,这可以解释为代表两个个体或样本之间的突变数量。因此,较短的距离将表明两者之间的关系更密切。
该算法在计算上可能相当繁重,但会给你一个很好的答案。实施起来也非常有趣且具有启发性。您可以在维基百科文章下找到几种实现它的方法。
如果您发现理解它的工作原理具有挑战性,我建议您手动设置一个示例网格,其中一个短字符串沿顶部水平,一个垂直沿左侧,并尝试手动进行计算,只是为了正确理解概念(一开始可能会令人困惑,但实际上并不那么困难)。
简单的match function
。它可能不是您的游戏所需的复杂性。该解决方案不需要对字符串进行显式split
即可获得DNA"字母"数组。DNA被比较in place
.
将每个"可疑"条目与"证据条目"进行比较。
int idLength = 3;
string evidence = //read from file
List<string> suspects = //read from file
List<double> matchScores = new List<double>();
foreach (string suspect in suspects)
{
int count = 0;
for (int i = idLength; i < suspect.Length; i++)
{
if (suspect[i + idLength] == evidence[i]) count++;
}
matchScores.Add(count * 100 / evidence.Length);
}
matchScores
列表现在包含所有单个比赛得分。我没有将最大匹配分数保存在单独的变量中,因为可能有多个具有相同分数的"嫌疑人"。要找出哪个主题最匹配,只需迭代matchScores
列表即可。最佳匹配项的索引是suspects
列表中嫌疑人的索引。
优化说明:
- 您可以检查每个"可疑"字符串以查看DNA序列从何处开始(即在哪个索引处开始),因为它可能是可变的;
- 可以在此处使用字典,而不是两个列表,其中"可疑字符串"作为键,匹配分数作为值