最小汉明距离

Posted

技术标签:

【中文标题】最小汉明距离【英文标题】:Minimum Hamming distance 【发布时间】:2017-03-04 19:10:47 【问题描述】:

我几天前开始学习 Python 3,所以如果我的代码很糟糕,我很抱歉。

我编写了一个脚本来查找列表中字符串的最小Hamming distance。现在我将使用的字符串是相同长度的二进制字,所以我的第一个问题是在 Python 中有一个按位的解决方案吗?

其次,我的代码是否正确,如果正确,提高效率的最佳方法是什么?我的搜索没有返回 Python 3 的答案,这就是我在这里问的原因。

def min_ham_dist(a):
    min_dist = len(a[0]) # Defaults minimum distance to maximum length of string.
    for i in range(len(a)):
        for j in range(i+1, len(a)): # Compares all words after ith word.
            dist = 0
            for k in range(len(a[i])): 
                if a[i][k] != a[j][k]:
                    dist += 1            
            if dist < min_dist:
                min_dist = dist
    return min_dist

非常感谢

【问题讨论】:

整数可以有任意长度吗?或者它们有最大长度吗? 在这种情况下,它们是固定的。我写这篇文章是为了解决一个包含 16 个长度为 12 的二进制字的列表的相当简单的问题。它应该通过视觉解决,但我觉得最好使用脚本来减少人为错误。不过,很高兴看到适用于任意长度的脚本。 该***页面上有一个简洁明了的 Python 3 示例;) 它基本上显示了完成这项工作所需的条件:如果两个输入字符串的长度相同,请使用 zip() 压缩它们,然后比较 zip 中的每一对,计算有多少不相等。 就在我的鼻子前面!我只是链接了***页面以供参考,并没有考虑自己阅读。谢谢你,达特茅斯。 【参考方案1】:

您也可以为此使用 scipy (pdist),但您必须将输入更改为二维数组。它以分数形式返回汉明距离。为此,您需要带数字的字符串(二进制字符串可以):

from scipy.spatial.distance import pdist

def min_ham_dist(a):
    return min(pdist([list(i) for i in a], 'hamming'))*len(a[0])

【讨论】:

以上是关于最小汉明距离的主要内容,如果未能解决你的问题,请参考以下文章

快速汉明距离评分

算法 - 计算汉明距离

汉明距离

汉明距离

汉明距离与汉明重量

461. 汉明距离