/ / comment calculer tous les voisins les plus proches à partir d'un octet dans une boule de hamming - java, voisin le plus proche, hamming-distance

Comment calculer tous les voisins les plus proches à partir d'un octet dans une balle de Hamming - java

Je veux calculer tous les voisins potentiels d'un octet donné avec une distance maximale.

Pour une distance de 1: 1, j'ai créé cette fonction:

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


for (int i = 0; i < 8; i++) {
value = (byte) (input ^mask);
neighbours.add(value);
mask = (byte) (mask << 1);

}
return neighbours;
}

Mais comment ajouter des voisins avec une distance> 1? quelqu'un peut-il m'aider à résoudre ce problème?

meilleures salutations

Réponses:

1 pour la réponse № 1

Comme je l'ai dit dans les commentaires, tous les byte qui n'ont pas de distance == 1 ou 0 seraient valables. Mais si vous voulez un algorithme qui vous donnera tous les octets qui sont au plus maxDist loin, vous pouvez faire une méthode récursive en tant que telle:

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);
}
}

Si vous voulez seulement les octets qui sont exactement maxDist loin, alors seulement ajouter if(maxDist == 0) et terminer la branche if(bit == 8)


0 pour la réponse № 2

d'accord, après une simple considération, je peux utiliser mon code du premier message et l'étendre avec une simple récursivité pour calculer tous les voisins:

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;
}

vous pouvez le tester avec cet exemple de code:

 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"));;
}