我想计算具有最大汉明距离的给定字节中的所有汉堡邻居。
汉明距离为1时,我创建了这个函数:
execFFMPEG
但是如何添加距离相近的邻居> 1? 有人可以帮我解决这个问题吗?
最好的问候
答案 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'));;
}