我有一个包含n个(约1000000个)字符串(DNA序列)的列表trans。我需要找到列表中所有序列的最小汉明距离。我实现了一个朴素的暴力算法,已经运行了一天以上,仍未给出解决方案。我的代码如下:
dmin=len(trans[0])
for i in xrange(len(trans)):
for j in xrange(i+1,len(trans)):
dist=hamdist(trans[i][:-1], trans[j][:-1])
if dist < dmin:
dmin = dist
有没有更有效的方法来做这件事?这里的hamdist是我编写的一个函数,用于查找汉明距离。它是
def hamdist(str1, str2):
diffs = 0
if len(str1) != len(str2):
return max(len(str1),len(str2))
for ch1, ch2 in zip(str1, str2):
if ch1 != ch2:
diffs += 1
return diffs
itertools
的好处来缩短你的代码;你的嵌套循环可以只是for s1, s2 in combinations(trans, 2)
。hamdist
函数可以使用return sum(islice(1 for ch1, ch2 in izip(str1, str2) if ch1 != ch2), prevMin))
。 - Frerich Raabe