Huffman-Tree-Codierung
Meine Huffman-Baum, die ich gebeten hatte, über früher hat ein anderes problem! Hier ist der code:
package huffman;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Huffman {
public ArrayList<Frequency> fileReader(String file)
{
ArrayList<Frequency> al = new ArrayList<Frequency>();
Scanner s;
try {
s = new Scanner(new FileReader(file)).useDelimiter("");
while (s.hasNext())
{
boolean found = false;
int i = 0;
String temp = s.next();
while(!found)
{
if(al.size() == i && !found)
{
found = true;
al.add(new Frequency(temp, 1));
}
else if(temp.equals(al.get(i).getString()))
{
int tempNum = al.get(i).getFreq() + 1;
al.get(i).setFreq(tempNum);
found = true;
}
i++;
}
}
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
return al;
}
public Frequency buildTree(ArrayList<Frequency> al)
{
Frequency r = al.get(1);
PriorityQueue<Frequency> pq = new PriorityQueue<Frequency>();
for(int i = 0; i < al.size(); i++)
{
pq.add(al.get(i));
}
/*while(pq.size() > 0)
{
System.out.println(pq.remove().getString());
}*/
for(int i = 0; i < al.size() - 1; i++)
{
Frequency p = pq.remove();
Frequency q = pq.remove();
int temp = p.getFreq() + q.getFreq();
r = new Frequency(null, temp);
r.left = p;
r.right = q;
pq.add(r); //put in the correct place in the priority queue
}
pq.remove(); //leave the priority queue empty
return(r); //this is the root of the tree built
}
public void inOrder(Frequency top)
{
if(top == null)
{
return;
}
else
{
inOrder(top.left);
System.out.print(top.getString() +", ");
inOrder(top.right);
return;
}
}
public void printFreq(ArrayList<Frequency> al)
{
for(int i = 0; i < al.size(); i++)
{
System.out.println(al.get(i).getString() + "; " + al.get(i).getFreq());
}
}
}
Was getan werden muss, jetzt muss ich eine Methode erstellen, wird die Suche durch den Baum zu finden, den binären code (011001 etc), um den besonderen Charakter. Was ist der beste Weg, dies zu tun? Vielleicht dachte ich, ich würde eine normale Suche durch den Baum, als wäre er ein AVL-Baum gehen, um den richtigen, wenn Ihr größer oder Links, wenn es kleiner ist.
Aber da die Knoten nicht verwenden, ints verdoppelt usw. aber nur mit Objekten, die Zeichen enthalten, die als String oder null, um zu signalisieren Ihr nicht ein Blatt, sondern nur eine Wurzel. Die andere option wäre eine in-order Durchlaufen, um das Blatt, die ich Suche, aber zur gleichen Zeit, wie würde ich feststellen, ob ich nach rechts Gefahren so viele Male oder Links, so viele Male, um den Charakter.
package huffman;
public class Frequency implements Comparable {
private String s;
private int n;
public Frequency left;
public Frequency right;
Frequency(String s, int n)
{
this.s = s;
this.n = n;
}
public String getString()
{
return s;
}
public int getFreq()
{
return n;
}
public void setFreq(int n)
{
this.n = n;
}
@Override
public int compareTo(Object arg0) {
Frequency other = (Frequency)arg0;
return n < other.n ? -1 : (n == other.n ? 0 : 1);
}
}
Was ich versuche zu tun ist, suchen Sie der binäre code, um tatsächlich zu jedem Charakter. Also, wenn ich versuchen zu codieren aabbbcccc
wie würde ich einen string enthält den Binärcode für einen nach Links ist 0 und rechts 1.
Was mich verwirrt ist, weil man nicht feststellen kann, wo etwas ist, da der Baum offensichtlich unausgewogen und es gibt keine Bestimmung, ob ein Zeichen nach rechts oder Links ab, wo Sie sind. So haben Sie zum durchsuchen des gesamten Baumes, aber wenn Sie sich zu einem Knoten, das ist nicht, was Sie suchen, haben Sie backtrack auf einen anderen root zu bekommen auf die anderen Blätter.
InformationsquelleAutor Zieklecknerizer | 2010-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Traverse durch die huffman-Baum-Knoten auf einer Karte, wie {'a': "1001", "b": "10001"} etc. Sie können diese Karte verwenden, um den binären code auf einen bestimmten Charakter.
Wenn Sie brauchen, um zu tun in umgekehrter, nur behandeln es als eine state machine:
Ehrlich gesagt, ich schaue nicht in Ihrem code. Es sollte ziemlich offensichtlich, was zu tun ist mit der Phantasie Baum.
Das klingt nach Spaß. Aber was ist der Punkt, der mit Daten in nicht-Blatt-Knoten?
InformationsquelleAutor Cheery
Denken Sie daran, wenn Sie haben 1001, wirst du nie einen 10010 oder 10011. Damit Ihre grundlegende Methode sieht wie folgt aus (in pseudocode):
Habe ich nicht gelesen Ihr Programm, um herauszufinden, wie Sie zu integrieren, aber das ist ein key-element der huffman-Codierung in einer nussschale
Probieren Sie etwas wie dieses - Sie versuchen zu finden token. Also, wenn Sie wollten, um die Zeichenfolge für "10010", Sie tun würde, Suche(root,"10010")
Warten Sie, ich nehme einen Blick in Ihr Programm und sehen, ob kann ich Ihnen keine Einsicht. Das klingt verdächtig nach Hausaufgaben - wenn es ist, sollten Sie die Hausaufgaben-tag. 🙂
ja, es ist HW glaube, ich sollte dann haha
Post von der Häufigkeit der Klasse.
ja, das würde funktionieren um eine Datei zu entschlüsseln, wurde erstellt, aber wenn ich wollte, um herauszufinden, die token für jedes Zeichen, was würde ich tun?
InformationsquelleAutor corsiKa
Als ich zwei Optionen, wenn ich war ein go-in bei der Huffman-Codierung-Codierung Baum.
option 1: Verwendung der Zeiger-basierten binären Baum. Ich kodierte die meisten dieser und dann spürte Sie, zu verfolgen, bis der Baum aus dem Blatt zu finden, eine Codierung, die ich brauchte, parent-Zeigern. andere weisen, wie bereits erwähnt, in diesem post, Sie tun eine Suche im Baum, die ist nicht eine Lösung zu finden, die Codierung sofort. Der Nachteil des pointer-basierte Struktur ist, die muss ich haben 3-Zeigern für jeden Knoten im Baum, ich dachte, das war zu viel. Der code zu Folgen, der Zeiger ist einfach, aber komplizierter, dass in option 2.
option 2: verwenden Sie eine array-basierte Struktur zur Darstellung der Kodierung Baum, die Sie verwenden, auf der Flucht zu codieren und zu decodieren. also, wenn Sie wollen, dass die Codierung eines Zeichens, finden Sie die Zeichen in das array. Ziemlich straight forward, ich benutze eine Tabelle so zu klatschen, rechts, und dort bekomme ich das Blatt. nun habe ich Spur bis zu der Wurzel, die mit dem index 1 im array. Ich mache eine (current_index /2) für die Muttergesellschaft. wenn das Kind index, parent /2, es ist eine Links-und auch sonst Recht.
option 2 war ziemlich einfach zu code, und obwohl das array kann leer Räumen. Ich dachte, es war besser in der Leistung als ein Zeiger-basiert Baum. Neben der Ermittlung der Stamm-und Blatt ist jetzt eine Frage der Indizes eher als Objekt geben. 😉 Das wird auch sehr nützlich sein, wenn Sie haben, schicken Sie uns Ihren Baum!?
auch, Sie nicht Suche (root, 10110) während der Dekodierung der Huffman-code. Sie nur zu Fuß den Baum durch den Strom der codierte Bitstrom, Links oder rechts, basierend auf Ihren bit-und, wenn Sie erreichen, das Blatt, die Ausgabe der Zeichen.
Ich hoffe, das war hilfreich.
Harisankar Krishna Swamy (Beispiel)
InformationsquelleAutor HarisankarK
Ich denke mal, deine Hausaufgaben gemacht oder sehr spät jetzt, aber vielleicht jemand anderes helfen.
Es ist eigentlich ziemlich einfach. Erstellen Sie einen Baum, wo 0 geht nach rechts und 1 nach Links. Lesen Sie den stream navigieren Sie durch den Baum. Wenn Sie auf ein Blatt, fand Sie einen Brief und beginnen Sie von vorne. Wie glowcoder sagte, Sie habe nie einen Brief an einen nicht-Blatt-Knoten. Der Baum deckt auch jede mögliche Sequenz von bits. So navigieren Sie in dieser Weise funktioniert immer, egal, die kodierte Eingabe.
Hatte ich einen Auftrag schreiben Sie eine huffman-encoder/decoder genau wie du vor einer Weile und ich schrieb einen blog-post mit dem code in Java und eine längere Erklärung : http://www.byteauthor.com/2010/09/huffman-coding-in-java/
PS. Die meisten die Erklärung ist auf der Serialisierung der huffman-Baum mit der geringsten möglichen Anzahl von bits, sondern auch das encoding/decoding-algorithmen sind ziemlich einfach in der sources.
InformationsquelleAutor Kevin Coulombe
Hier ist eine Scala-Implementierung: http://blog.flotsam.nl/2011/10/huffman-coding-done-in-scala.html
InformationsquelleAutor Wilfred Springer