/
BurrowsWheeler.java
81 lines (73 loc) · 2.02 KB
/
BurrowsWheeler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class BurrowsWheeler {
// apply Burrows-Wheeler encoding, reading from standard input and writing to standard output
public static void encode()
{
String s = BinaryStdIn.readString();
CircularSuffixArray csa = new CircularSuffixArray(s);
for(int i = 0;i < s.length();i++)
{
int index = csa.index(i);
if(index == 0) {
BinaryStdOut.write(i);
break;
}
}
for(int i = 0;i < s.length();i++)
{
int index = csa.index(i);
if(index != 0) {
BinaryStdOut.write(s.charAt(index-1));
}
else
BinaryStdOut.write(s.charAt(s.length()-1));
}
BinaryStdOut.flush();
}
// apply Burrows-Wheeler decoding, reading from standard input and writing to standard output
public static void decode()
{
int first = BinaryStdIn.readInt();
String s = BinaryStdIn.readString();
int N = s.length();
int R = 256;
int[] count = new int[R+1];
char[] aux = new char[N];
int[] next = new int[N];
for(int i = 0;i < N;i++)
count[s.charAt(i)+1]++;
for(int r = 0;r < R;r++)
count[r+1] += count[r];
for(int i = 0;i < N;i++) {
int tmp = count[s.charAt(i)]++;
aux[tmp] = s.charAt(i);
next[tmp] = i;
}
for(int i = 0;i < N;i++)
{
BinaryStdOut.write(aux[first]);
first = next[first];
}
BinaryStdOut.flush();
}
// if args[0] is '-', apply Burrows-Wheeler encoding
// if args[0] is '+', apply Burrows-Wheeler decoding
public static void main(String[] args)
{
BurrowsWheeler bw = new BurrowsWheeler();
if (args[0].equals("-"))
{
bw.encode();
}
else if (args[0].equals("+"))
{
bw.decode();
}
else
{
throw new RuntimeException("Illegal command line argument");
}
}
}