Або ж він буде гнати і пихнути і дути ваш будинок!
Це було абсолютно неважливо. Ця проблема насправді стосується кодування Хаффмана . Суть її полягає в частоті символів у заданому тексті, щоб зменшити його подання. Іншими словами, скажімо, що наш алфавіт є a
через z
і пробіл. Це 27 символів. Кожен з них може бути унікально закодований всього в 5 біт, оскільки 5 біт має достатньо місця для 32 символів. Однак у багатьох ситуаціях (наприклад, англійська чи взагалі мови) деякі символи частіше, ніж інші. Ми можемо використовувати менше бітів для більш частих символів і (можливо) більше бітів для менш частих символів. Зроблено правильно, є загальна економія кількості бітів, і оригінальний текст все ще можна однозначно реконструювати.
Візьмемо для прикладу "це питання про кодування Хаффмана". Цей текст має 37 символів, що нормально буде 37 * 8 = 296 бітів, хоча лише 37 * 5 = 185 біт, якщо ми використовуємо лише 5 біт для кожного символу. Майте це на увазі.
Ось таблиця (сортування) кожного символу та їх частоти в тексті, відсортована від найбільш часто до найменш частої (де _ означає пробіл):
_ 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.