【发布时间】:2018-11-12 14:39:37
【问题描述】:
我有一个包含数百万个全部 24 个字符长的 DNA 序列的大型阵列。 DNA 序列应该是随机的,并且只能包含 A、T、G、C、N。我正在尝试找到彼此在一定汉明距离内的字符串。
我的第一种方法是计算每个字符串之间的汉明距离,但这需要很长的时间。
我的第二种方法使用掩码方法来创建字符串的所有可能变体并将它们存储在字典中,然后检查是否发现此变体超过 1 次。对于 1 的汉明距离,这工作得非常快(20 分钟),但是非常占用内存,并且不适用于 2 或 3 的汉明距离。
Python 2.7 实现我的第二种方法。
sequences = []
masks = {}
for sequence in sequences:
for i in range(len(sequence)):
try:
masks[sequence[:i] + '?' + sequence[i + 1:]].append(sequence[i])
except KeyError:
masks[sequence[:i] + '?' + sequence[i + 1:]] = [sequence[i], ]
matches = {}
for mask in masks:
if len(masks[mask]) > 1:
matches[mask] = masks[mask]
我正在寻找一种更有效的方法。我遇到了 Trie-trees、KD-trees、n-grams 和索引,但我不知道什么是解决这个问题的最佳方法。
【问题讨论】:
-
您希望允许的最大汉明距离是多少?
-
没有细节很难回答。我将计算所有序列的汉明 weights,并创建一个字典,该字典将权重作为键,将所有匹配字符串的列表作为值。然后使用参考值的权重,您应该能够轻松找到给定距离的所有单词。
-
好问题,但可能超出了 SO 的范围:(1) 特定于某些方面的领域(生物信息学),因此您可能想尝试bioinformatics.stackexchange.com 或 biostars.org,以及(2 ) 不提出精确的技术问题(错误、代码的具体优化等)。但是,我可以给您的提示是搜索已经执行此操作的软件,因为它可能已经过优化和测试。此外,这可能会有所帮助:en.wikipedia.org/wiki/Alignment-free_sequence_analysis
标签: python algorithm bioinformatics