Reconstuct Huffman-Baum für die Decodierung
Ich habe Kodierungen für komprimierte string-Daten mittels Huffman-Kompression
ich.e "mehr Geld"
Codierung
\n 0110
1011
d 100
e 11
m 001
n 000
o 010
r 0111
y 1010
**
001010011111101100101000011101010110001111100111000110
Möchte ich rekonstruieren, den Huffman-Baum in java zu Dekodieren Kodieren. Implementierung oder zum Beispiel für die Dekodierung.
Ich habe versucht, und codiert die perfekte Lösung.
public class HuffmanTree {
public Node root;
public HuffmanTree(){
this.root = new Node();
}
public void add(char data, String sequence){
Node temp = this.root;
int i = 0;
for(i=0;i<sequence.length()-1;i++){
if(sequence.charAt(i)=='0'){
if(temp.left == null){
temp.left = new Node();
temp = temp.left;
}
else{
temp = (Node) temp.left;
}
}
else
if(sequence.charAt(i)=='1'){
if(temp.right == null){
temp.right = new Node();
temp = temp.right;
}
else{
temp = (Node) temp.right;
}
}}
if(sequence.charAt(i)=='0'){
temp.left = new Node(data);
}
else{
temp.right = new Node(data);
}
}
public String getDecodedMessage(String encoding){
String output = "";
Node temp = this.root;
for(int i = 0;i<encoding.length();i++){
if(encoding.charAt(i) == '0'){
temp = temp.left;
if(temp.left == null && temp.right == null){
output+= temp.getData();
temp = this.root;
}
}
else
{
temp = temp.right;
if(temp.left == null && temp.right == null){
output+= temp.getData();
temp = this.root;
}
}
}
return output;
}
//Traversal of reconstructed huffman tree for debugging.
public void traversal(Node node){
if(node == null)
return;
System.out.println(node);
traversal(node.left);
traversal(node.right);
}
}
class Node{
Node left;
Node right;
char data;
public Node(){
}
public Node(char data){
this.data = data;
}
public void setData(char data){
this.data = data;
}
public char getData(){
return this.data;
}
@Override
public String toString(){
if(this.data == Character.UNASSIGNED){
return "No Value";
}
else
return ""+this.data;
}
}
Wenn Sie die verschlüsselte Nachricht in einer text-Datei das Leerzeichen kann zu Problemen führen, so habe ich code geschrieben für die man auch.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Test {
public static void main(String[] bscs){
HuffmanTree tree = new HuffmanTree();
String inputFile;
String outputFile;
Scanner kb = new Scanner(System.in);
System.out.println("Please enter the name of the Input File");
inputFile = kb.nextLine();
File f = new File(inputFile);
Scanner fr = null;
try {
fr = new Scanner(new File(inputFile));
fr.nextLine();
tree.add('\n', fr.nextLine().trim());
String temp = fr.nextLine();
if(temp.charAt(0)==' ' && temp.charAt(1)==' ')
{
tree.add(' ', temp.trim());
}
else
tree.add(temp.charAt(0), temp.substring(1));
while(fr.hasNext()){
temp = fr.nextLine();
if(temp.equals("**")){
break;
}
else
tree.add(temp.charAt(0), temp.substring(1));
}
FileWriter f0 = new FileWriter(new File("decoded.ou"));
f0.write(tree.getDecodedMessage(fr.nextLine()));
f0.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
- Ich habe versucht, und es gelöst mit binären Baum. Wie bekomme ich Noten für die Zuordnung Teile ich hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off, Sie brauchen nicht zu rekonstruieren, den Huffman-Baum. Sie können suchen Sie einfach Linear für den code, das passt der nächste Satz von bits. Denn es ist ein Präfix-code, gibt es eine einzigartige Lösung. So das erste Spiel ist das richtige Spiel.
Wenn Sie wollen, um einen Baum, starten Sie einfach mit dem ersten bit, das bietet Ihnen zwei Möglichkeiten. 0 Links 1 rechts. Keiner von denen ist ein code, also sowohl Zweig auf das zweite bit, das gleiche Problem. Einer der vier endet dort am code 11 e. Nun verzweigen sich die übrigen drei auf das Dritte bit. Vier der sechs zu Ende mit einem code. Zweig die restlichen zwei. Die vier enden alle in einer code und du bist fertig. Jetzt können Sie den Baum zu Dekodieren, auf der Suche an einem bit zu einer Zeit, bis Sie einen code. Emittieren Sie den code, und beginnen Sie wieder an der Wurzel des Baumes für das nächste bit.