2016-03-07 6 views
1

Я хочу рассчитать все возможные хамминга соседей из заданного байта с максимальным расстоянием от помех.как рассчитать всех ближайших соседей из байт в шаре для помех

Для Хэмминга расстоянии 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? может кто-нибудь помочь мне решить эту проблему?

наилучшими пожеланиями

+0

вы хотите расстояние hamming> 1 между чем и что? – Maljam

+0

Нет, я хочу список возможных соседей. Я даю расстояние для хамминга в качестве входных данных и хочу рассчитать всех возможных соседей в этом радиусе затухания. –

+0

Как известно, у меня есть максимальное расстояние и строка из 8 бит. –

ответ

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

хорошо, после простого рассмотрения, я могу использовать мой код из первого поста и раздолье его с простой рекурсии для вычисления всех соседей:

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