/ / як обчислити всіх найближчих сусідів з байта в кулі забивання - java, найближчий сусід, дистанція забивання

як розрахувати всі найближчі сусіди від байту в шарі з ганчіркою - java, найближчий сусід, віддалений хемінг

Я хочу обчислити всіх можливостей, які забивають сусідів, із заданого байта з максимальною відстані забивання.

Для відстані в забиванні 1 я створив цю функцію:

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

Але як додати сусідів з відстанню> 1? може хтось допоможе мені вирішити цю проблему?

з найкращими побажаннями

Відповіді:

1 для відповіді № 1

Як я вже сказав у коментарях, всі byte які не мають відстані == 1 або 0 були б дійсними. Але якщо ви хочете алгоритм, який дасть вам максимально всі байти 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)


0 для відповіді № 2

Добре, після простого розгляду я можу використовувати свій код з першого посту і розгорнути його за допомогою простої рекурсії, щоб обчислити всіх сусідів:

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