【发布时间】:2014-08-28 18:02:04
【问题描述】:
我有一组 n (~1000000) 个字符串(DNA 序列)存储在一个列表中。我必须找到列表中所有序列的最小汉明距离。我实现了一个幼稚的蛮力算法,已经运行了一天多,还没有给出解决方案。我的代码是
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
【问题讨论】:
-
除了优化汉明函数外,比较的次数没有什么可做的。但是,如果您告诉我们您要达到的目标,也许有一个启发式解决方案不会经过所有比较
-
谢谢。我必须找出一组 DNA 序列的最小距离是否高于阈值。 (如果是,那么我知道估计算法返回了可靠的值。)
-
你可以使用
itertoolsgoodness 来缩短你的代码;你的嵌套循环可以只是for s1, s2 in combinations(trans, 2)。hamdist函数可以使用return sum(islice(1 for ch1, ch2 in izip(str1, str2) if ch1 != ch2), prevMin)) -
@FrerichRaabe 非常感谢。 Itertools 帮助我显着加快了实施速度。
标签: python algorithm bigdata hamming-distance