汉明距离之和

时间:2015-01-22 18:15:36

标签: optimization hamming-distance

我开始准备面试并遇到了这个问题:

  • 给出了一个整数数组
  • 现在以二进制表示法计算数组中所有整数对的汉明距离之和。

示例:

given {1,2,3} or {001,010,011} (used 3 bits just to simplify)
result= HD(001,010)+HD(001,011)+HD(010,011)= 2+1+1=4;

唯一的优化,从纯粹的蛮力解决方案,我知道我可以在这里使用,是在汉明距离的单独计算中,如下所示:

int hamming_distance(unsigned x, unsigned y)
{
    int       dist;
    unsigned  val;

    dist = 0;
    val = x ^ y;    // XOR

    // Count the number of bits set
    while (val != 0)
    {
        // A bit is set, so increment the count and clear the bit
        dist++;
        val &= val - 1;
    }

    // Return the number of differing bits
    return dist;
}

解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以单独考虑位位置。这给你32个(或其他一些数字)更容易的问题,你仍然需要计算所有汉明距离对的总和,除非它现在超过1位数。

两个1位数之间的汉明距离是它们的XOR。

现在它已成为this问题最简单的问题 - 它已经按比特分割。

因此,为了重申这个问题的答案,你采取一个位置,计算0的数量和1的数量,乘以那些来得到这个位的贡献。对所有位位置求和。它比链接问题更简单,因为在这个问题中每个比特的贡献权重为1。

答案 1 :(得分:3)

这是我的C ++实现,具有O(n)复杂度和O(1)空间。

pre-compliled