Sonst wird er schnauben und pusten und dein Haus in die Luft jagen!
Das war völlig irrelevant. Bei dieser Herausforderung geht es eigentlich um Huffman-Codierung . Das Wesentliche ist, dass die Häufigkeit der Zeichen in einem bestimmten Text verwendet wird, um seine Darstellung zu verkürzen. Mit anderen Worten, lassen Sie uns sagen, dass unser Alphabet a
durch z
und Raum ist. Das sind 27 Zeichen. Jedes von ihnen kann in nur 5 Bits eindeutig codiert werden, da 5 Bits genug Platz für 32 Zeichen haben. In vielen Situationen (z. B. Englisch oder Sprachen im Allgemeinen) sind einige Zeichen jedoch häufiger als andere. Wir können weniger Bits für die häufigeren Zeichen und (vielleicht) mehr Bits für die weniger häufigen Zeichen verwenden. Richtig gemacht, ergibt sich eine Gesamtersparnis bei der Anzahl der Bits, und der ursprüngliche Text kann immer noch eindeutig rekonstruiert werden.
Nehmen wir als Beispiel "Diese Frage handelt von Huffman-Codierung". Dieser Text ist 37 Zeichen lang, was normalerweise 37 * 8 = 296 Bit wäre, obwohl nur 37 * 5 = 185 Bit, wenn wir nur 5 Bit für jedes Zeichen verwenden. Merk dir das.
Hier ist eine (sorta) Tabelle der einzelnen Zeichen und ihrer Häufigkeiten im Text, sortiert von am häufigsten bis am seltensten (wobei _ für ein Leerzeichen steht):
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
Eine damit verbundene optimale Kodierung könnte sein:
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Es sollte sofort klar sein, dass dies eine bessere Codierung ist, als nur 5 Bits für jedes Zeichen zu verwenden. Lassen Sie uns herausfinden, wie viel besser!
145 Bits , verglichen mit 185! Das ist eine Ersparnis von 40 Bit oder etwas mehr als 20%! (Dies setzt natürlich voraus, dass Informationen über die Struktur zum Decodieren verfügbar sind.) Diese Codierung ist optimal, da durch Ändern der Zeichendarstellung keine Bits mehr gelöscht werden können.
Die Aufgabe
- Schreiben Sie ein Programm oder eine Funktion mit einem Parameter, der ...
- Übernimmt die Eingabe von STDIN (oder einer Entsprechung) oder als einzelnes Argument.
- Geben Sie eine optimale Huffman-Codierung wie oben mit den nach Häufigkeit sortierten Zeichen aus (die Reihenfolge innerhalb einer Häufigkeit spielt keine Rolle).
- Sie können davon ausgehen, dass die Zeichen in der Eingabe auf den ASCII-Bereich
32..126
plus eine neue Zeile beschränkt sind. - Sie können davon ausgehen, dass die Eingabe nicht länger als 10.000 Zeichen ist (im Idealfall sollte die Eingabe theoretisch unbegrenzt sein).
- Ihr Code sollte ziemlich schnell fertig sein. Das obige Beispiel sollte im schlimmsten Fall nicht länger als eine Minute dauern. (Dies soll brachiale Gewalt ausschließen.)
- Die Bewertung erfolgt in Byte.
Beispiele
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
Viel Spaß beim Codieren!
Beachten Sie, dass diese ähnliche Frage eng verwandt ist, auch wenn es sich um ein Duplikat handelt. Doch der Konsens bisher ist auf Meta , dass die ältere sollte ein Duplikat dieser eine in Betracht gezogen werden.
this question is about huffman coding
ich die Anzahl der Bits mit 145 und nicht mit 136 gezählt.