Или же он будет пыхтеть, пыхтеть и взрывать твой дом!
Это было совершенно неактуально. Эта проблема на самом деле о кодировании Хаффмана . Суть в том, что частота символов в данном тексте используется, чтобы сделать его представление короче. Другими словами, скажем, что наш алфавит a
сквозной z
и пробел. Это 27 символов. Каждый из них может быть уникально закодирован всего в 5 битах, потому что 5 битам достаточно места для 32 символов. Однако во многих ситуациях (например, в английском или в других языках) некоторые символы встречаются чаще, чем другие. Мы можем использовать меньше битов для более частых символов и (возможно) больше битов для менее частых символов. Если все сделано правильно, то количество битов в целом уменьшится, а исходный текст все равно можно будет восстановить уникальным образом.
Давайте возьмем «этот вопрос о кодировании Хаффмана» в качестве примера. Этот текст имеет длину 37 символов, что обычно составляет 37 * 8 = 296 бит, хотя только 37 * 5 = 185 бит, если мы используем только 5 бит для каждого символа. Запомни.
Вот таблица (sorta) каждого символа и их частоты в тексте, отсортированная от наиболее частой к наименее (где _ обозначает пробел):
_ 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
Соответствующее оптимальное кодирование может быть:
_ 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
Должно быть сразу ясно, что это будет лучшая кодировка, чем просто использование 5 битов для каждого символа. Давайте выясним, насколько лучше!
145 бит по сравнению с 185! Это экономия 40 бит или чуть более 20%! (Это, конечно, при условии, что информация о структуре доступна для декодирования.) Это кодирование является оптимальным, поскольку больше битов не может быть отброшено путем изменения представления любого символа.
Задание
- Напишите программу или функцию с одним параметром, который ...
- Принимает входные данные из STDIN (или эквивалентные) или в качестве одного аргумента.
- Выведите оптимальное кодирование Хаффмана, как указано выше, с символами, отсортированными по частоте (порядок в пределах класса частот не имеет значения).
- Вы можете предположить, что символы на входе ограничены диапазоном ASCII
32..126
плюс новая строка. - Вы можете предположить, что ввод не более 10 000 символов (в идеале, теоретически, ввод должен быть неограниченным).
- Ваш код должен закончиться достаточно быстро. Приведенный выше пример в худшем случае должен занять не более минуты. (Это предназначено, чтобы исключить грубую силу.)
- Оценка в байтах.
Примеры
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
Удачного кодирования!
Обратите внимание, что этот похожий вопрос тесно связан даже с тем, что этот вопрос является дубликатом. Тем не менее, единый консенсус в отношении Меты заключается в том, что более старый следует считать его дубликатом.
this question is about huffman coding
я посчитал число битов равным 145 , а не 136.