Chcem vypočítať všetky possbie hamming susedov z daného bajtu s maximálnou hammingovou vzdialenosťou.
Pri hammerovej vzdialenosti 1 som túto funkciu vytvoril:
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;
}
Ale ako pridať susedov s vzdialenosťou> 1? môže mi niekto pomôcť vyriešiť tento problém?
S Pozdravom
odpovede:
1 pre odpoveď č. 1Ako som už povedal v komentároch, všetci byte
ktoré nemajú vzdialenosť == 1 alebo 0 by boli platné. Ale ak chcete algoritmus, ktorý vám poskytne všetky bajty, ktoré sú najviac maxDist
by ste mohli urobiť rekurzívnu metódu ako takú:
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);
}
}
Ak chcete len bajty, ktoré sú presne maxDist
ďaleko, potom len pridať if(maxDist == 0)
a ukončite vetvu if(bit == 8)
0 pre odpoveď č. 2
po jednoduchom zvážení môžem použiť môj kód z prvého príspevku a rozšíriť ho jednoduchou rekurziou na výpočet všetkých susedov:
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;
}
môžete to testovať pomocou tohto príkladu kódu:
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"));;
}