Consider sequences of 36 bits. Each such sequence has 32 5 - bit sequences consisting of adjacent bits. For example, the sequence 1101011… contains the 5 - bit sequences 11010,10101,01011,…. Write a program that prints all 36 - bit sequences with the two properties:
1. The first 5 bits of the sequence are 00000.
2. No two 5 - bit subsequences are the same.
I generalized it to print all sequence of n (n <= 64) bits with: 1. the first k bits of the sequence are 0s and 2. no two k - bit subsequences are the same.
There probably are smarter ways. I used the brutal force search. Start from kth bit, get all permutations of the sequence with the first k bits zero, then for every sequence, check if all bits are unique, and print out those that contain unique k - bit sequence and haven't been printed.
I am looking for a better approach, here is my open question of the problem on Stackoverflow.
import java.util.*;
public class UniquekBitSequence {
public static void uniqueSequence(int n, int k){
long rst = 0;
uniqueSequence(n, k, rst, k - 1, new HashSet ());
}
private static void uniqueSequence(int n, int k, long rst, int start, Set printed){
if(isDistinct(rst, n, k) && printed.add(rst)){
System.out.println(Long.toBinaryString(rst));
}
for(int i = start + 1; i < n; i++){
rst |= (1 << i);
uniqueSequence(n, k, rst, i, printed);
rst = setZero(rst, i);
uniqueSequence(n, k, rst, i, printed);
}
}
public static int getInt(long rst, int right, int left){
int mask = (1 << (left + 1)) - 1 - ((1 << (right)) - 1);
return ((int)rst & mask) >> right;
}
public static long setZero(long rst, int start){
int mask = ~(1 << start);
return rst & mask;
}
private static boolean isDistinct(long rst, int n, int k){
Set bits = new HashSet ();
for(int i = k - 1; i < n; i++){
if(!bits.add(getInt(rst, i - k + 1, i)))
return false;
}
return true;
}
public static void main(String[] args){
uniqueSequence(10, 5);
}
}
No comments:
Post a Comment