Die liebe Not mit dem Huffman Code...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Marceline
User
Beiträge: 20
Registriert: Freitag 2. November 2018, 16:35

Hallo people und peopelinnen,

ich hoffe dass ich hiermit nicht den Shitstorm of Doom heraufbeschwöre, aber ich komme seit fünf Tagen partout nicht weiter.

1) (2 Punkte) Gegeben sei folgende Nachricht: ”Mississippi River in Ontario isn’t Mississippi River in Mississippi!”
Zeiche den zugehörigen Huffman-Baum und stelle die Codetabelle auf, wie sie es in der Vorlesung gelernt haben. Geben Sie alle
erforderlichen Werte an! Wie lautet die oben angegebene Nachricht in ihrer codierten Form?
2) (2 Punkte) Schreibe ein Python 3.7.x Programm, welches die in der Aufgabe 11.1 aufgestellte Codetabelle beinhaltet. Das Programm soll Befehle encode und
decode verstehen und die darauffolgende Eingabe codieren oder decodieren können. Falsche Eingaben sind mit einer Warnung in
der Konsole zu quittieren. Geben jeweils 5 Testfälle für Codierung und Decodierung an. Zusätzlich gebe an, wie Deine Implementierung die Nachricht
3) (4 Punkte) Schreibe ein in Python 3.7.x Programm, welches eine Eingabe (Nachricht) über die Konsole entgegennimmt, sie analysiert und basierend darauf eine Codetabelle aufbaut.
• Gebe diese Codetabelle in der Konsole aus.
• Gebe die codierte Eingabe in der Konsole aus.
• Implementiere eine Funktion zur Decodierung und geben die decodierte Nachricht zur Verifikation in der Konsole aus.
Setze die Befehle newbase und showtable um. Ermögliche damit eine neue Eingabe und lasse für diese eine neue Codetabelle berechnen und gegebenenfalls ausgeben. Setze weiterhin Befehle encode und decode um, wie Du es in der Aufgabe 11.2 gemacht hast.
Hinweise:
Zur Lösung dieser Aufgabe dürfen built-in Sortiermethoden verwendet werden. Denke daran, dass nicht alle Datentypen geordnet sind. Dennoch können hier auch solche Datentypen sehr hilfreich sein.
Nicht lauffähige Programme werden nicht bewertet, dabei gilt als Maßstab NUR die Ausführbarkeit in der Konsole!


Aufgabe 1 hab ich noch alleine lösen können,
Bild
Bild
Bild

Ich weiß, im Netz gibt's gefühlt 3000 Huffmann Code-Tutorials, aber die sind alle auf fortgeschrittenen Niveau und erklären auch nicht, wie ich diese Code-Tabelle implementieren soll. Zur Erklärung:

Spalte 1: Die relative Häufigkeit, wie oft ein Zeichen allgemein im String vorkommt
Spalte 2: Der Logarithmus dualis: ( ln (Relative Häufigkeit)/ln(2) *) Relative Häufigkeit
Spalte 3: Blockcode der Reihe nach aufgeschrieben
Spalte 4: Der Huffman Code (auf den 0 und 1 in der Graphik basierend)
Spalte 5: Gewichtete Codelänge (Anzahl der Bits im Huffmann Code * Relative Häufigkeit

Wie kann ich das in Python berechnen lassen und zusätzlich noch in so einer Tabellenform ausgeben? Dazu müsste man doch alle Werte von diesem Baum manuell eintragen, or?
Kann ich bei Aufgabe 2) nicht einfach die Variablen neu definieren, z.B. "M == 000" oder ist das geschummelt?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wieso alle Werte vom Baum in die Tabelle und dann auch noch manuell? Wenn man das eine vorliegen hat, sollte sich das andere daraus erstellen lassen. Der Baum und die erste Spalte der Tabelle, die relative Häufigkeit und die fälschlicherweise mit Hoffman überschriebene Spalte in der Tabelle sind doch im Grunde 1:1 im Baum zu finden. Oder eben umgekehrt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Marceline
User
Beiträge: 20
Registriert: Freitag 2. November 2018, 16:35

Ja natürlich ist das alles im Baum zu finden, aber die Aufgabe zwingt einen dazu, dass jetzt nochmal alles als Programm zu implementieren. "Schreibe ein Python 3.7.x Programm, welches die in der Aufgabe 1 aufgestellte Codetabelle beinhaltet. Das Programm soll Befehle encode und decode verstehen und die darauffolgende Eingabe codieren oder decodieren können"

Also ich muss jetzt sozusagen eine Funktion schreiben die
- die relative Häufigkeit der eingegebenden Buchstaben erkennt
- diesen komischen Logarithmus Dualis berechnet
- eine Tabelle mit Blockcode generiert
-die Eingabe erkennt und einen Huffman-Tree erstellt
-basieren auf dieser Eingabe den Huffman-Code generiert

Und wenn ich das richtig verstehe, ist Aufgabe 2 und Aufgabe 3 ja fast dasselbe, nur das bei Aufgabe 2 die Werte aus Aufgabe 1 verarbeitet werden sollen (die müssen dann auch nochmal alle manuell ins Programm eingepflegt werden) und bei Aufgabe 3 das Ganze für allgemeine Eingaben.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie hast Du denn die Tabelle erstellt?
Schritt 1: Zeichen zählen, z.B. mit collections.Counter
Schritt 2: Erzeuge den Baum
Schritt 3: Durchlaufe den Baum und merke Dir wieder in einem Wörterbuch für jedes Zeichen die Bitfolge.
Codieren heißt, Bits aus dem Wörterbuch Zeichen für Zeichen zusammensetzen.
Decodieren heißt, mit den Bits den Baum durchlaufen und Knoten ausgeben.

Zeig Deinen Code, an welcher Stelle Du nicht weiter kommst.

Wie kann es sein, dass wenn die ideale Bitlänge 3,3 ist, Du mit Huffman auf 2,5 Bit kommst?
Antworten