Задан набор символов и соответствующая им строка в кодировке Хаффмана.Можем ли мы использовать попытки их декодировать?
У меня есть следующий класс, который иллюстрирует мой подход.Я пробовал несколько тестовых примеров через Интернет, но я не полностью удовлетворен тем, что нашел.
Это тестовый пример, который я нашел в интернете 'geeksforgeeks', и соответствующая закодированная строка приведена в главномМетод в качестве аргумента для моей функции поиска.Этот тестовый пример, кажется, работает нормально.Может кто-нибудь объяснить, почему мы можем или почему мы не можем использовать попытки?
public class HuffmanDecode {
static class Code {
Character c;
Code[] children;
boolean isEnd;
public Code(){
this.c = null;
this.children = new Code[2];
this.isEnd = false;
for(int i = 0 ; i < 2; i++){
children[i] = null;
}
}
}
static Code root;
static StringBuilder str = new StringBuilder();
public static void buildTree(String input, Code current, char ch){
for(int i = 0 ; i < input.length() ; i++){
char curr = input.charAt(i);
int index = curr - '0';
if(current.children[index] == null){
current.children[index] = new Code();
}
current = current.children[index];
}
current.isEnd = true;
current.c = ch;
}
public static String search(String input, Code current){
for(int i = 0 ; i < input.length(); i++){
char curr = input.charAt(i);
int index = curr - '0';
if(current!=null && current.isEnd){
str.append(current.c);
current = root;
i--;
}
else if(current.children[index]!=null && !current.isEnd){
current = current.children[index];
}
}
if(current!=null && current.isEnd)str.append(current.c);
return str.toString();
}
public static void main(String[] args) {
HuffmanDecode obj = new HuffmanDecode();
HashMap<Character, String> map = new HashMap<>();
root = new Code();
map.put('e',"10");
map.put('f',"1100");
map.put('g',"011");
map.put('k',"00");
map.put('o',"010");
map.put('r',"1101");
map.put('s',"111");
map.forEach((key, value)->{
obj.buildTree(value,root,key);
});
search("01110100011111000101101011101000111",root);
System.out.println(str.toString());
}
}