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

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

  • 示例:
    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;
    }
    

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

    最佳答案

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

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

    现在它已成为 this 问题的最简单案例——它已经按位拆分了。

    所以重申这个问题的答案,你取一个位位置,计算 0 的数量和 1 的数量,将它们相乘以获得这个位位置的贡献。将所有位的位置相加。它甚至比链接问题更简单,因为在这个问题中每一位贡献的权重都是1。

    关于optimization - 汉明距离和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28095890/

    10-12 22:40