Huffman algorithmus

NonPlusUltra

Mitglied
Hallo Java Community,

ich versuch schon seit paar Stunden mein Glück an ein Java Programmier Projekt(Huffman),
meiner Meinung nach bin ich schon für meine Kenntnisse ziemlich weit gekommen:oops:

ich komm aber an einer Stelle einfach nicht weiter

und zwar habe ich ein ArrayList, die voller Knoten ist davon will ich die zwei kleinsten Knoten herausfinden (mit kleinsten knoten meine ich ,die zwei Knoten mit der kleinsten Häufigkeit der Zeichen)
also als Rückgabetyp brauch ich die zwei Knoten

hat einer ein Tipp für mich?


das sind Methoden die ich schon implementiert habe

getLeft(); -> linker Teilbaum
getRight(); -> Rechhter Teilbaum
getSymbol();-> ASCII zeichen
getWeight();-> gibt die Häufigkeit der Zeichen aus
 

Michael...

Top Contributor
Entweder die Liste nach der Häufigkeit sortieren und dann einfach die ersten zwei Indizes nehmen.
(s. Comparator, Collections.sort(...))
Oder die Liste in einer Schleife durchlaufen und sich die zwei kleinsten Indizes merken.
 

NonPlusUltra

Mitglied
meinst du das so in etwa ?
aber das klappt ihrgend wiebei mir nicht^^

Java:
int[] min = nodeArray[0].getWeight();
       for (int x = 0; x < noArray[x].getight().length; x++){
           if (nodesArray[x].getWeht() > min) {
               mi1 = ndeArray[x];    
           }
        }
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Dachte es wird eine ArrayList verwendet?
aber das klappt ihrgend wiebei mir nicht^^
Soll vermutlich heißen: Lässt sich nicht kompilieren ;-)
Meinte es in etwa so:
Java:
		int min1 = 0;
	    for (int x = 0; x < nodesArray[x].length; x++){
	    	if (nodesArray[x].getWeight() < nodesArray[min1].getWeight()) {
	    		min1 = x;    
	        }
	    }
Es ging ja auch darum den (Index des) Knoten zu bekommen und nicht nur den Wert.
 

NonPlusUltra

Mitglied
Oki vielen dank^^

ich merk nur gerade das ich denn arrayList glaube ich falsch gemacht habe

beim Compelieren kommt immer alls fehler
cannot find symbol - variable nodeArray
Java:
        int min = 0;
        for (int x = 0; x < nodeArray[x].length; x++){
            if (nodeArray[x].getWght() < nodArray[min].getWght()) {
                min = x;    
            }
        }
 
Zuletzt bearbeitet:

NonPlusUltra

Mitglied
seh gerade auch im Ahang von mein ProProjekt steht da auch das mit int size();

muss ich es dann so schreiben nodes.get(x).size() ?

Edit:

glaub habs verstanden^^

so solls doch sein oder

int a = nodes.size();

dann in der schleife x< a
 
Zuletzt bearbeitet:

NonPlusUltra

Mitglied
wieder zu meiner anfangs frage darf ich das so machen um min2 herauszufinden

Java:
          int lenght = nodes.size();
        int min1 = 0;
        int min2 = 0;
        for (int x = 0; x < lenght; x++){
            if (nodes.get(x).getWeight() < nodes.get(min1).getWeight()) {
                min1 = x;
                if (nodes.get(x).getWeight()<= nodes.get(min2).getWeight()){
                    min2=x;
                }
            }
        }
 
Zuletzt bearbeitet:

NonPlusUltra

Mitglied
Java:
        for (int x = 0; x < lenght-1; x++){
            for (int y = x; y < lenght; y++){
                            if (nodes.get(x).getWeight() > nodes.get(y).getWeight()) {
                //... Exchange elements
                int temp = nodes.get(x).getWeight();
                nodes.get(x).getWeight() = nodes.get(y).getWeight();
                nodes.get(y).getWeight() = temp;
            }

dann ist doch nodes.get(0) mein min 1 und nodes.get(1) mein min2

aber was ist wenn min1 = min2 ist wie kann ich das mit selectionsort berücksichtigen

aber hab da noch fehler der Compiler spuckt hier ein fehler raus
nodes.get(x).getWeight() = nodes.get(y).getWeight();
 

Michael...

Top Contributor
Welche Fehler melder der Kompiler?
getWeight() liefert ja scheibar ein int Array, dann geht folgendes natürlich nicht
Code:
int temp = nodes.get(x).getWeight();
Willst Du die Liste damit sortieren? Dann musst Du die Positionen der Knoten tauschen. Du manipulierst hier aber nur die in den Knoten gespeicherten Häufigkeiten.
 

NonPlusUltra

Mitglied
hmm hab mir was anderes einfallen lassen (das hat was zu bedeuten:lol:)

Java:
    public INode createTree(String text) {

        ArrayList<INode> nodes = new ArrayList<INode>();
        int [] Counter = getFrequencies(text);

   
}

dan ist ja INode Min2 und INode Min1 die die ich suche oder?

der compiler merkt zwar kein fehler , aber ich trau mir selbst nicht ^^

EDIT: der compiler spinnt bei der variante nur wenn ich die beiden Knoten verbinden will dann steht beim Compiler das er die Variable Min2 nicht finden kann
 
Zuletzt bearbeitet:

Michael...

Top Contributor
hmm hab mir was anderes einfallen lassen (das hat was zu bedeuten:lol:)
Interessant
der compiler merkt zwar kein fehler , aber ich trau mir selbst nicht ^^
Und das zu Recht ;-) Da sind mehrere Denkfehler drin.

Min1 und Min2 nur innerhalb Ihrer Schleifen gültig, es wird immer gegeben nodes.get(0) verglichen...

und selbst wenn das behoben wäre, würde das mit den zwei Schleifen so nicht korrekt funktionieren.

Zum Suche reicht eine Schleife.

Ich würde die Liste (mittels Comparator) sortieren. Und dann einfach Index 0 und 1 als die zwei Minima abgreifen.
 

NonPlusUltra

Mitglied
ich schau mir mal an wie das mit den Comperator funktioniert dann versuch ich es mal^^


kann man den Comerator auch in die Methode einfach rein schreiben ohne eine Neue zu machen?
 

NonPlusUltra

Mitglied
Java:
  Collections.sort(nodes, new Comparator(){
 
            public int compare(INode o1, INode o2) {
               return o1.getWeight().compareTo(o2.getWeight());
            }
        }
);

sortiert er jetzt die list nach Häufigkeit?

beim Compiler kommt auch noch diese fehler Meldung das die klasse Huffman nicht Abstract sei
 

Michael...

Top Contributor
Man muss noch den Typ Parameter <INode> am Konstruktor des Comparators mit angeben
Java:
Collections.sort(nodes, new Comparator<INode>() {...
Beim return muss wenn das erste Objekt vor dem zweiten Objekt einsortiert werden soll eine negative und umgekehrt eine positive Zahl zurückgeben.
Wie jetzt Deine getWeight() Werte verglichen werden müssen müsstest Du sagen, da diese ja - glaube ich ein int[] zurückgeben. compareTo kann nur Objekte vergleichen, die Comparable implementieren.
 

Michael...

Top Contributor
Ach so.
Den kann man dann einfach subtrahieren.
Entweder
Code:
return o2.getWeigth() -o1.getWeigth();
oder
Code:
return o1.getWeigth() -o2.getWeigth()
in der compare Methode zurückgeben. Je nachdem, ob absteigend oder aufsteigend sortiert werden soll.

Zum Kopieren:
Java:
Collections.sort(nodes, new Comparator<INode>() {
	public int compare(INode o1, INode o2) {
		return o1.getWeight() - o2.getWeight();
	}
});
 

NonPlusUltra

Mitglied
darf ich das dann auch so schreiben ?

Java:
        int lenght = nodes.size();
        
        while( lenght == 1 ){

            Collections.sort(noes, new Coarator<INode>() {
                    public int comre(INode o1, INode o2) {
                        return o1.getWeight() - o2.getWeight();
                    }
                } );
                
             nodes.get(0).mee(nodes.get(1)); //
             nods.remove(noes.get(0));    //
             nodes.ad(nodes.et(0).merge(odes.et(1)));  
            }
 
Zuletzt bearbeitet:

Michael...

Top Contributor
darf ich das dann auch so schreiben ?

Java:
        int lenght = nodes.size();
        
        while( lenght == 1 ){

            Collections.sort(nodes, new Comparator<INode>() {
                    public int compare(INode o1, INode o2) {
                        return o1.getWeight() - o2.getWeight();
                    }
                } );
                
             nodes.get(0).merge(nodes.get(1)); //verbinde die Knoten
             nodes.remove(nodes.get(0));    // lösche denn Knoten 1
             nodes.remove(nodes.get(1));    // lisch den knoten 2
             nodes.add(nodes.get(0).merge(nodes.get(1)));  //trage denn verbindeten Knotten in die liste
                
            }
Dürfen schon ;-)

Soll wohl
Code:
while( lenght > 1)
heißen (und vermutlich auch length)
Beim Löschen könntest Du aber durchaus auf ernsthaftere Probleme stossen.

Gibt die merge - Methode ein neues Knoten Objekt zurück oder verändert sie den Knoten an dem sie aufgerufen wird?
Du rufst get(0) und get(1) auf nach dem diese zuvor aus der List gelöscht wurden und greifst damit auf Index 2 und 3 der ursprünglichen Liste zu - ist vermutlich auch nicht gewollt.
 

NonPlusUltra

Mitglied
so hab ich die merge methode Implementiert

sie soll zwei knoten addieren und die beiden knotten sollen vom neuen knotten die kinder sein

also so in etwas

AB => Eltern knoten
A B => Kinder Knoten
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Dann sollte das in etwa so lauten:
Java:
while(nodes.size() > 1 ){
            Collections.sort(nodes, new Comparator<INode>() {
                    public int compare(INode o1, INode o2) {
                        return o1.getWeight() - o2.getWeight();
                    }
            });
            nodes.add(nodes.get(0).merge(nodes.get(1)));  
            nodes.remove(nodes.get(0));    // lösche denn Knoten 1
            nodes.remove(nodes.get(1));    // lisch den knoten 2
}

Wobei man den Comparator dann eher ausserhalb der Schleifer erzeugen sollte und nicht bei jedem Schleifendurchlauf neu.
 

NonPlusUltra

Mitglied
Danke für deine hilfe aber ich glaube meine merge methode ist ihrgend wie falsch

kannst du mal druber gucken

Java:
    public INode merge(INode o){
        int A = o.getWeight();
        int B = this.getWeight();
        int Sum = A + B;
 
         if ( A <= B ) { 
            left = other.get0();
            right = this.get1();
        }
        else if ( A >= B) { 
            right = other.get1();
            left = this.get0();
        }
 
        INode Neu = new Node ( '*', Sum, right, left);
 
        return Neu;
 

thorstenthor

Bekanntes Mitglied
Um die kleinsten x Elemente zu finden, genügt doch ein maxHeap mit x Elementen, dessen Wurzel man immer dann austauscht, wenn ein Element kleiner ist. Oder eine abfallende priority queue, wo man nur einfügt, wenn vorderstes Element größer ist.

das wäre schneller als Sortieren, nur ist die Frage, ob man diese x Elemente auch noch in sortierter Reihenfolge benötigt
 

NonPlusUltra

Mitglied
also das mit denn sortieren klappt ja schon

aber ich glaube meine merge methode klappt nicht so richtig

wenn ich zb die text eingebe : DDDAAASSS

dann kommt nur
*(6)

anstatt
Code:
      *(9)
D(3)      *(6)
         A(3)  S(3)

der macht nur ein teilbaum und denn stehlt er auch nicht richtig da^^
 

Michael...

Top Contributor
k.Ahnung wo und wie left und right deklariert sind. Ich hoffe mal Du überschreibst hier nicht die Instanzvariablen des Knotens. Und das getX (was auch immer das ist) ist hier auch Fehl am Platz. Du willst Doch die beiden Knoten als Kindknoten des neuen Knotens setzen??
Code:
other
ist übrigens auch nirgends deklariert und soll wohl o heißen
Java:
         if ( A <= B ) { 
            left = other;
            right = this;
        }
        else if ( A >= B) { 
            right = other;
            left = this;
        }
Falls meine Befürchtung zutrifft, das ganze geht auch kürzer:
Java:
public INode merge(INode o){
        int a = o.getWeight();
        int b = this.getWeight();
        if (a <= b)
                return new INode('*', a +b, this, o);
        return new INode('*', a +b, o, this);
}
 

Legendary

Neues Mitglied
Was gibst du als return an?

Ich beschäfftige mich mit ähnlichem (;)) und ich ich weiß einfach nicht, was ich returnen soll... das Programm will ja einen return des Datentypes INode... Wenn man die Liste returnen will kommt "Ne, geht nicht weil is'n Array." -.-
 
6

6aEZSW

Gast
kann mir jemand sagen wo hier der Fehler ist
Java:
while( g > 1 ){
              Node min1;
              Node min2;
           min1 = (Node) node.remove(0);
            for(int i = 1; i < g; i++) {
        
                Node temp = (Node) node.get(i);
               
                if (temp.getWeight() < min1.getWeight()) {
                    node.remove(i);
                    node.add(min1);
                    temp= min1; 
                }
            }
            min2 = (Node) node.remove(0);
          
            for(int i = 0; i < g ; i++) {
               Node temp = (Node) node.get(i);
             
                if (temp.getWeight() < min2.getWeight()) {
                   node.remove(i);
                   node.add(min2);
                   temp= min2;
                } 
            }
            node.add((Node) min1.merge(min2));
         }
         return node.get(0);
        }
[code=Java]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L [Aufgabe] Huffman Bäume Java Basics - Anfänger-Themen 10
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
S Problem mit einem rekursivem FloodFill Algorithmus Java Basics - Anfänger-Themen 62
B Algorithmus Square und Multiply Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D Frage Boyer-Moore Algorithmus Java Basics - Anfänger-Themen 7
M Komplexität Algorithmus Java Basics - Anfänger-Themen 8
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
B Code Verständnisfragen - FLoyd Warshall Algorithmus Java Basics - Anfänger-Themen 1
B Algorithmus zum entmischen einer Zahlenfolge Java Basics - Anfänger-Themen 15
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
T Algorithmus zur Überprüfung eines binären Suchbaums Java Basics - Anfänger-Themen 2
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
L Frage zu BubbleSort Algorithmus Java Basics - Anfänger-Themen 2
B gibt es ein Stundenplan-Algorithmus? Java Basics - Anfänger-Themen 11
O Algorithmus-Problem Java Basics - Anfänger-Themen 5
P Euklidischer Algorithmus Java Basics - Anfänger-Themen 9
L Greates Commong Dividend - euklidischer Algorithmus, modulos not positive Java Basics - Anfänger-Themen 5
J Euklidischer Algorithmus Java Basics - Anfänger-Themen 1
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
M Dijkstras Algorithmus Java Basics - Anfänger-Themen 5
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
C Ideen für einen Algorithmus Java Basics - Anfänger-Themen 1
F Best Practice Algorithmus optimieren - Binaeruhr Java Basics - Anfänger-Themen 2
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
L Welcher Algorithmus ist das ? Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
O Java Zufalls-Verteil-Algorithmus Java Basics - Anfänger-Themen 3
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
C Sortieren ohne Algorithmus Java Basics - Anfänger-Themen 8
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
A Text Verschriebung/Algorithmus(?) Java Basics - Anfänger-Themen 8
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
U Peterson Algorithmus Java Basics - Anfänger-Themen 13
algebraiker Collections Bräuchte Hilfe bei dem Algorithmus - LinkedHashMap Java Basics - Anfänger-Themen 2
S A* Path Algorithmus in Java schon vorhanden Java Basics - Anfänger-Themen 3
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben