我的Python汉明距离码有问题吗?

2024-06-02 12:17:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python实现Hamming distance。汉明距离通常用于测量两个码字之间的距离。该操作只是执行异或操作。例如,如果我们有码字10011101和10111110,那么它们的异或将是00100011,汉明距离称为1+1+1=3

我的代码如下:

def hamming_distance(codeword1, codeword2):
    """Calculate the Hamming distance between two bit strings"""
    assert len(codeword1) == len(codeword2)
    x, y = int(codeword1, 2), int(codeword2, 2) # '2' specifies that we are reading a binary number
    count, z = 0, x^y
    while z:
        count += 1
        z &= z - 1
    return count

def checking_codewords(codewords, received_data):
    closestDistance = len(received_data) # set default/placeholder closest distance as the maximum possible distance.
    closestCodeword = received_data # default/placeholder closest codeword
    for i in codewords:
        if(hamming_distance(i, received_data) < closestDistance):
            closestCodeword = i
            closestDistance = hamming_distance(i, received_data)
    return closestCodeword

print(checking_codewords(['1010111101', '0101110101', '1110101110', '0000000110', '1100101001'], '0001000101'))

hamming_distance(codeword1, codeword2)以二进制值的形式获取两个输入参数codeword1codeword2,并返回两个输入码字之间的汉明距离

checking_codewords(codewords, received_data)如果接收到的数据中有任何错误,则应确定正确的码字(即,输出是正确的码字字符串)。不过,正如您所看到的,我还没有添加“如果接收到的数据中有任何错误”部分

我刚刚用一组示例测试了checking_codewords函数,除了一个之外,它似乎对所有示例都正常工作。当我使用码字集['1010111101', '0101110101', '1110101110', '0000000110', '1100101001']和接收到的数据'0001000101'时,输出是0101110101,这显然是不正确的。我的代码是否有问题,或者0101110101实际上是正确的,而示例是否有问题?或者这只是一个接收到的数据没有错误的情况,所以我的代码错过了它


Tags: 数据代码距离datalencountdistancereceived
1条回答
网友
1楼 · 发布于 2024-06-02 12:17:56

在我看来,不清楚为什么您的算法会将初始字符串转换为一个整数,以实现按位差异

我的意思是,在断言等长后,您可以使用zip函数简单地计算差值:

sum([c1!=c2 for c1,c2 in zip(codeword1,codeword2)])

对于和函数,Python考虑true=1,false=0。

对代码进行一些简化:

def hamming_distance(codeword1, codeword2):
    """Calculate the Hamming distance between two bit strings"""
    assert len(codeword1) == len(codeword2)
    return sum([c1!=c2 for c1,c2 in zip(codeword1,codeword2)])

def checking_codewords(codewords, received_data):
    min_dist, min_word =  min([(hamming_distance(i, received_data), received_data) for i in codewords])
    return min_word
    

print(checking_codewords(['1010111101', '0101110101', '1110101110', '0000000110', '1100101001'], '0001000101'))

相关问题 更多 >