Генерирование двоичной последовательности
Мне нужно сгенерировать двоичную последовательность ключей, где каждый ключ имеет длину 'x', и каждый ключ генерируется определенной операцией над предыдущим ключом.
Предполагая, что длина ключа равна 3, я должен быть в состоянии сгенерировать последовательность как (иллюстрация):
001 010 100 011 .....
Каждый ключ должен быть получен некоторой битовой операцией над предыдущим ключом, пока мы не исчерпали все возможные перестановки для этой конкретной длины ключа.
Поскольку я новичок в битовых операциях - это возможная операция, и как мы генерируем эту последовательность для любой заданной длины.
Я бы предпочел пример на языке Java, но идея состоит в том, чтобы понять логику и конкретную работу.
2 ответа
Возможно, вы захотите поискать псевдослучайные генераторы, если прогрессия должна быть фиксированной битовой операцией. Возможно, вас заинтересуют серые коды.
Вот два подхода в Java:
Повторяющийся:
Начать с 0
в 2^length
и преобразовать каждое число в двоичную строку, дополненную нулями впереди.
public static List<String> binarySequence(final int length) {
final int noOfItems = 1 << length;
final List<String> sequences = new ArrayList<>(noOfItems);
final String format = "%" + length + "s";
for (int num = 0; num < noOfItems; num++) {
final String binary = String.format(format,
Integer.toBinaryString(num)).replace(' ', '0');
sequences.add(binary);
}
return sequences;
}
Рекурсивный:
Базовый случай (длина 1), только два значения: 0
а также 1
, За length > 1
, готовый 0
а также 1
в последовательности из предыдущей рекурсии. Например, для длины 2, предшествующий 0
а также 1
к предыдущему выводу рекурсии (0, 1
): 00, 01, 10, 11
,
public static List<String> binarySequenceRecur(final int length) {
final List<String> sequences;
if (length <= 1) {
sequences = Arrays.asList("0", "1");
} else {
final List<String> prevSequences = binarySequence(length - 1);
final LinkedList<String> seqs = new LinkedList<>();
for (final String seq: prevSequences) {
seqs.addLast("0" + seq);
}
for (final String seq: prevSequences) {
seqs.addLast("1" + seq);
}
sequences = seqs;
}
return sequences;
}