Altrimenti sbufferà e sbufferà e farà esplodere la tua casa!
Questo era completamente irrilevante. Questa sfida riguarda in realtà la codifica Huffman . L'essenza di ciò è la frequenza dei caratteri in un dato testo che viene utilizzata per accorciarne la rappresentazione. In altre parole, diciamo che il nostro alfabeto è a
attraverso z
e lo spazio. Sono 27 personaggi. Ognuno di essi può essere codificato in modo univoco in soli 5 bit perché 5 bit hanno spazio sufficiente per 32 caratteri. Tuttavia, in molte situazioni (come l'inglese o le lingue in generale), alcuni personaggi sono più frequenti di altri. Possiamo usare meno bit per i caratteri più frequenti e (forse) più bit per i caratteri meno frequenti. Fatto bene, c'è un risparmio complessivo nel numero di bit e il testo originale può ancora essere ricostruito in modo univoco.
Prendiamo ad esempio "questa domanda riguarda la codifica huffman". Questo testo è lungo 37 caratteri, che normalmente sarebbero 37 * 8 = 296 bit, sebbene solo 37 * 5 = 185 bit se utilizzassimo solo 5 bit per ciascun carattere. Tienilo a mente.
Ecco una (sorta) tabella di ogni personaggio e le loro frequenze nel testo, ordinate dal più al meno frequente (dove _ sta per uno spazio):
_ 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
Una codifica ottimale associata potrebbe essere:
_ 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
Dovrebbe essere immediatamente chiaro che questa sarà una codifica migliore rispetto all'uso di 5 bit per ogni carattere. Scopriamo quanto è meglio, però!
145 bit , rispetto a 185! Questo è un risparmio di 40 bit, o poco più del 20%! (Ciò ovviamente presuppone che le informazioni sulla struttura siano disponibili per la decodifica.) Questa codifica è ottimale perché non è possibile eliminare più bit modificando la rappresentazione di qualsiasi carattere.
L'obiettivo
- Scrivi un programma o una funzione con un parametro che ...
- Prende input da STDIN (o equivalente) o come singolo argomento.
- Emetti un codice Huffman ottimale come sopra con i caratteri ordinati per frequenza (l'ordine all'interno di una classe di frequenza non ha importanza).
- Si può presumere che i caratteri nell'input siano limitati all'intervallo ASCII
32..126
più una nuova riga. - Si può presumere che l'input non sia più lungo di 10.000 caratteri (idealmente, in teoria, l'input dovrebbe essere illimitato).
- Il tuo codice dovrebbe finire ragionevolmente veloce. L'esempio sopra riportato non dovrebbe richiedere più di un minuto nel peggiore dei casi. (Questo ha lo scopo di escludere la forza bruta.)
- Il punteggio è in byte.
Esempi
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
Buona programmazione!
Si noti che questa domanda simile è strettamente correlata, anche al punto che questa è una copia. Tuttavia, finora il consenso su Meta è che quello più vecchio dovrebbe essere considerato un duplicato di questo.
this question is about huffman coding
, ho contato il numero di bit per essere 145 , non 136.