如何从汉明球中的一个字节计算所有最近邻居

时间:2016-03-07 10:17:13

标签: java nearest-neighbor hamming-distance

我想计算具有最大汉明距离的给定字节中的所有汉堡邻居。

汉明距离为1时,我创建了这个函数:

execFFMPEG

但是如何添加距离相近的邻居> 1? 有人可以帮我解决这个问题吗?

最好的问候

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说,所有没有距离= {1或0的byte都是有效的。但是如果你想要一个算法,它会给你所有最多maxDist的字节,你可以这样做一个递归方法:

public static void getNeighbours(ArrayList<Byte> nbrs, byte input, int bit, int maxDist) {
    if(maxDist == 0 || bit == 8) {
        nbrs.add(input);
    } else {
        getNeighbours(nbrs, (byte) (input^(1<<bit)), bit+1, maxDist-1);
        getNeighbours(nbrs, input, bit+1, maxDist);
    }
}  

如果您只想要完全maxDist的字节,那么只需添加if(maxDist == 0)并终止分支if(bit == 8)

答案 1 :(得分:0)

好的,经过简单的考虑,我可以使用第一篇文章中的代码并通过简​​单的递归来扩展它来计算所有邻居:

public static HashSet<Byte> hammingNeighbours(byte input, int maxDistance){
    HashSet<Byte> neighbours = new HashSet<>();
    neighbours.add(input);
    byte value;;
    byte mask = 1;


        for (int i = 0; i < 8; i++) {
            value = (byte) (input ^mask);
            if(maxDistance > 1){
            neighbours.addAll(hammingNeighbours(value,maxDistance -1));
            }
            else{
                neighbours.add(value);
            }
            mask = (byte) (mask << 1);

        }
    return neighbours;
}

您可以使用以下示例代码对其进行测试:

 HashSet<Byte> bset = hammingNeighbours((byte) 0, 2);
    System.out.println(bset.size());
    for (Byte b : bset) {
        System.out.println(String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0'));;
    }