Ou então ele bufará e soprará sua casa!
Isso foi completamente irrelevante. Esse desafio é realmente sobre a codificação de Huffman . A essência disso é que a frequência de caracteres em um determinado texto é utilizada para diminuir sua representação. Em outras palavras, digamos que nosso alfabeto é a
através do z
espaço. São 27 caracteres. Cada um deles pode ser codificado exclusivamente em apenas 5 bits, porque 5 bits têm espaço suficiente para 32 caracteres. No entanto, em muitas situações (como inglês ou idiomas em geral), alguns caracteres são mais frequentes que outros. Podemos usar menos bits para os caracteres mais frequentes e (talvez) mais bits para os caracteres menos frequentes. Feito corretamente, há uma economia geral no número de bits e o texto original ainda pode ser reconstruído exclusivamente.
Vamos pegar "esta pergunta é sobre a codificação de Huffman" como exemplo. Esse texto tem 37 caracteres, o que seria normalmente 37 * 8 = 296 bits, embora apenas 37 * 5 = 185 bits se usarmos apenas 5 bits para cada caractere. Tenha isso em mente.
Aqui está uma tabela (sorta) de cada caractere e suas frequências no texto, classificadas da mais para a menos frequente (onde _ representa um espaço):
_ 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
Uma codificação ótima associada pode ser:
_ 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
Deve ficar claro imediatamente que essa codificação será melhor do que usar 5 bits para cada caractere. Vamos descobrir o quão melhor, porém!
145 bits , em comparação com 185! Isso economiza 40 bits, ou pouco mais de 20%! (É claro que isso pressupõe que as informações sobre a estrutura estejam disponíveis para decodificação.) Essa codificação é ideal porque não é possível eliminar mais bits alterando a representação de qualquer caractere.
A tarefa
- Escreva um programa ou função com um parâmetro que ...
- Recebe entrada de STDIN (ou equivalente) ou como um único argumento.
- Produza uma codificação Huffman ideal, como acima, com os caracteres classificados por frequência (a ordem dentro de uma classe de frequência não importa).
- Você pode supor que os caracteres na entrada sejam restritos ao intervalo ASCII
32..126
mais uma nova linha. - Você pode supor que a entrada não tenha mais que 10.000 caracteres (idealmente, em teoria, a entrada deve ser ilimitada).
- Seu código deve terminar razoavelmente rápido. O exemplo dado acima não deve demorar mais do que um minuto, na pior das hipóteses. (Isso pretende excluir a força bruta.)
- A pontuação está em bytes.
Exemplos
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
Feliz codificação!
Observe que essa pergunta semelhante está intimamente relacionada, mesmo a ponto de ser uma duplicata. No entanto, o consenso até agora no Meta é que o mais antigo deve ser considerado uma duplicata deste.
this question is about huffman coding
, contei que o número de bits era 145 , não 136. #