Итак, я пытался декодировать, используя huffman, и у меня есть эта рабочая функция, но она имеет ужасную временную и пространственную сложность. До сих пор я читал каждый байт, получал каждый бит и добавлял его в currentBitString. Затем я перевернул строку и добавил ее к огромной строке, которая в основном содержит все байтовые данные для файла. После этого я прослеживал гигантскую строку и искал код Хаффмана, а затем, если он совпадал, я записывал в файл. Этот код занимает около 60 секунд для декодирования 200 КБ, что очень плохо, но я не совсем уверен, как его улучшить? Я знаю, что могу для начала записать в файл более одного байта за раз, но, похоже, это не улучшило время, когда я пытался?
public static void decode(File f) throws Exception {
BufferedInputStream fin = new BufferedInputStream(new FileInputStream(f));
int i = f.getName().lastIndexOf('.');
String extension="txt";
String newFileName=f.getName().substring(0, i)+extension;
File nf = new File(newFileName);
BufferedOutputStream fw = new BufferedOutputStream(new FileOutputStream(nf));
int c;
byte bits;
byte current;
String currentBitString="";
String bitString="";
//read each byte from file, reverse it, add to giant bitString
//reads ALL BYTES
while( (c=fin.read())!=-1 ) {
current=(byte) c;
currentBitString="";
bits=0;
for(int q=0;q<8;q++) {
bits=getBit(current,q);
currentBitString+=bits;
}
StringBuilder bitStringReverse=new StringBuilder(currentBitString);
bitString+=bitStringReverse.reverse().toString();
}
currentBitString="";
boolean foundCode=false;
for(int j=0;j<bitString.length();j++) {
currentBitString+=bitString.charAt(j);
for(int k=0;k<nodes.length;k++) {
//nodes is an array of huffman nodes which contains the the byte
//data and the huffman codes for each byte
if(nodes[k].code.compareTo(currentBitString.trim())==0) {
fw.write(nodes[k].data);
foundCode=true;
break;
}
}
if(foundCode) {
currentBitString="";
foundCode=false;
}
}
fw.flush();
fw.close();
fin.close();
}
вот функция gitBit
public static byte getBit(byte ID, int position) {
// return cretin bit in selected byte
return (byte) ((ID >> position) & 1);
}
вот члены данных класса HuffmanNode (массив узлов - это массив HuffmanNodes)
public class HuffmanNode{
byte data;
int repetitions;
String code;
HuffmanNode right;
HuffmanNode left;
}