Подтема 4 из 4
Длина закодированного слова
Как сделать закодированное слово как можно короче: частым буквам — короткие коды, но не всегда.
Длина закодированного слова
Длина закодированного слова — сумма длин кодов всех его букв с повторами, поэтому частым буквам выгодно давать короткие коды. Это самый частый тип задания 4 последних лет.
Главный пример страницы — слово МОЛОКО: сообщения состоят из букв М, О, Л, К, Н, заданы коды О — 00 и К — 01. Сначала разберёмся, что именно считать.
Что уменьшать
Сначала пойми, какую величину нужно сделать наименьшей. Внешне похожие задачи могут требовать разных вычислений:
| Что требуется | Что считаем |
|---|---|
| Длина кода одной буквы | Количество знаков только в её коде |
| Сумма длин нескольких кодовых слов | Длину каждого указанного кода по одному разу |
| Сумма длин всех кодовых слов | Длины кодов всех букв алфавита по одному разу |
| Длина закодированного сообщения | Длины кодов с учётом всех повторений букв |
Например, для таблицы А — 0, Б — 10, В — 110, Г — 111 сумма длин всех кодов равна 1 + 2 + 3 + 3 = 9, а длина сообщения АААБВ — 1 + 1 + 1 + 2 + 3 = 8. Это разные величины.
Частоты и длины
Длина сообщения — сумма произведений частот букв на длины их кодов. Чтобы быстро считать длину длинного сообщения, удобно сначала подсчитать, сколько раз встречается каждая буква. Количество появлений буквы будем называть её частотой в данном сообщении. Для АААБВ:
| Буква | Частота | Длина кода | Вклад в длину сообщения |
|---|---|---|---|
| А | 3 | 1 | 3 · 1 = 3 |
| Б | 1 | 2 | 1 · 2 = 2 |
| В | 1 | 3 | 1 · 3 = 3 |
| Г | 0 | 3 | 0 · 3 = 0 |
Итого 3 + 2 + 3 = 8. Общее правило:
Длина сообщения = сумма произведений частот букв на длины их кодов.
Буква с нулевой частотой не увеличивает длину конкретного сообщения. Но её код по-прежнему занимает место в дереве.
Буква не в слове
Буква, которой нет в слове, всё равно требует места в дереве. Вернёмся к МОЛОКО. Алфавит М, О, Л, К, Н; заданы О — 00, К — 01. Нужно уменьшить длину записи слова МОЛОКО. Сначала считаем частоты: О — 3, К — 1, М — 1, Л — 1, Н — 0.
Известные коды дают неизменный вклад: 3 · 2 + 1 · 2 = 8. Остаётся выбрать коды М, Л и Н. Ветвь 0… полностью занята кодами 00 и 01, поэтому все новые коды должны находиться в ветви 1….
Если забыть о Н, можно предложить М — 10, Л — 11. Тогда длина слова получилась бы 8 + 2 + 2 = 12. Но это неверное решение: букве Н не осталось места.
Правильный вариант — разделить ветвь, как в подтеме 3: М — 10, Л — 110, Н — 111.
Тогда длина слова 8 + 2 + 3 = 13. Проверим запись целиком: М | О | Л | О | К | О — это 10 | 00 | 110 | 00 | 01 | 00, длины 2 + 2 + 3 + 2 + 2 + 2 = 13.
Тонкости:почему меньше нельзя
Код 1 использовать нельзя: он занял бы всё место для М, Л и Н. Значит, коды М и Л имеют длину хотя бы 2. Но дать обеим буквам двухзначные коды тоже нельзя: 10 и 11 заняли бы всю свободную ветвь, не оставив места Н.
Следовательно, один из кодов М и Л имеет длину хотя бы 3, их сумма не меньше 2 + 3 = 5, а длина слова — не меньше 8 + 5 = 13. Полученный вариант достигает этой границы.
Резервная ветвь
Все буквы, которых нет в слове, можно временно представить одной резервной ветвью. Если бы кодировался весь русский алфавит, решение МОЛОКО не изменилось бы: место 111 стало бы резервом для Н и всех остальных букв, а длина слова осталась бы 13. Потом резерв делится на нужное количество кодов, как в подтеме 3.
Так можно, если длина кодов не ограничена — в задании 4 так почти всегда.
При подсчёте суммы длин всей таблицы каждая буква учитывается отдельно.
Частым — короткие
Для уже выбранных мест короткие коды выгодно назначать более частым буквам. Предположим, мы уже выбрали два свободных кодовых слова — длины 2 и длины 4. Буква А встречается пять раз, буква Б — один раз.
Если короткий код отдать А: 5 · 2 + 1 · 4 = 14. Если короткий код отдать Б: 5 · 4 + 1 · 2 = 22. Первый вариант лучше на 8 бит. Причина проста: сокращение кода А на два знака экономит два знака при каждом из пяти появлений, а увеличение кода Б на два знака добавляет их только один раз.
Тонкости:то же правило для любых частот и длин
Пусть p — большая частота, q — меньшая частота, a — меньшая длина, b — большая длина. Разница между невыгодным и выгодным назначением:
(pb + qa) − (pa + qb) = (p − q)(b − a).
Обе разности неотрицательны, поэтому результат тоже неотрицателен.
Это относится к буквам, коды которых можно выбирать. Заданные в условии соответствия переставлять нельзя.
Получается порядок действий для наименьшей длины слова:
- Посчитать частоты букв слова и вклад букв с заданными кодами.
- Найти свободные ветви. Буквам вне слова, если они есть, нужно одно резервное место.
- Буквам слова по убыванию частоты давать самый короткий свободный код, после которого остаётся место всем остальным буквам и резерву.
- Проверить, не выгоднее ли разделить короткую вершину, — об этом следующий раздел.
Короткий не всегда выгоден
Самый короткий код для частой буквы иногда ухудшает весь результат. Поэтому, когда у частой буквы есть выбор, рисуют оба варианта дерева и сравнивают длины слова. Пример: алфавит из семи букв А, Б, В, Г, Д, Е, Ж, заданы Д — 01, Е — 10, Ж — 110. В сообщении А встречается 4 раза, Б — 3 раза, В и Г — по 2.
Букв Д, Е, Ж в сообщении нет, но их заданные коды занимают место. Свободны две ветви: 00… и 111…. Первая начинается на глубине 2, вторая — на глубине 3.
Попробуем сразу дать самой частой букве А кратчайший код 00. Теперь Б, В, Г нужно разместить в 111…, и лучшее размещение для них — Б — 1110, В — 11110, Г — 11111. Длина сообщения 4 · 2 + 3 · 4 + 2 · 5 + 2 · 5 = 40.
Теперь попробуем не занимать вершину 00 одной буквой, а разделить её: А — 000, Б — 001, В — 1110, Г — 1111.
Код самой частой буквы стал длиннее, но всё сообщение сократилось: 4 · 3 + 3 · 3 + 2 · 4 + 2 · 4 = 37. Почему? Код А удлинился на один знак, и это добавило 4 бита — по одному на каждое появление. А коды Б, В, Г укоротились на один знак каждый и сэкономили 3 + 2 + 2 = 7 бит. Мы добавили четыре бита, а сэкономили семь.
Правило: если частой букве можно отдать короткую свободную вершину, нарисуй два варианта — буква занимает вершину целиком или вершина делится на две — и сравни длины слова. Разделить вершину выгодно, когда буквы, которые поднимутся выше, вместе встречаются чаще, чем буква, которая опустится на уровень.
Итого
- Величинакод одной буквы, сумма длин или длина слова — разные ответы
- Длина словасумма «частота × длина кода»
- Буква вне словачастота 0, но место в дереве нужно
- Частым — короткиена готовых местах; заданные коды не переставляют
- Короткая вершинасравни с вариантом, где она разделена
Проверьте себя
Ответь сначала сам, потом открой ответ.
0, Б — 10. Сколько знаков в записи слова АББА?ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
00 или разделить её на 000 и 001. Как решить, что выгоднее?ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Длина записи АББАВ
Задана таблица А — 0, Б — 10, В — 110, Г — 111. Сколько двоичных знаков нужно для записи слова АББАВ?
Введите число.
Подсказка
Сумма частот, умноженных на длины кодов.
Решение
0 | 10 | 10 | 0 | 110, 1 + 2 + 2 + 1 + 3 = 9.
Ответ: 9
Две разные величины
Для таблицы А — 0, Б — 10, В — 110, Г — 111 найди сумму длин всех кодов и длину записи слова ВАГА.
Введите два числа через пробел: сумму длин, затем длину записи слова.
Подсказка
Сумма длин считает каждый код один раз, длина слова — каждое появление буквы.
Решение
Сумма длин всех кодов: 1 + 2 + 3 + 3 = 9. Длина записи ВАГА: 3 + 1 + 3 + 1 = 8 — буква А встречается дважды.
Ответ: 9 8
Два места и две буквы
Свободны два места — длины 2 и длины 3. Буква К встречается в сообщении 4 раза, буква Л — один раз. Какая наименьшая длина записи этих пяти букв?
Введите число.
Подсказка
Частой букве — короткое место.
Решение
4 · 2 + 1 · 3 = 11, а наоборот 4 · 3 + 1 · 2 = 14.
Ответ: 11
Слово МОМ
Алфавит содержит только А, М, О, К. Известно: А — 0. Какова минимальная длина записи слова МОМ?
Введите число.
Подсказка
Букве К, которой нет в слове, тоже нужно место: её частота 0.
Решение
М — 10, О — 110, К — 111; 2 + 3 + 2 = 7. Два двухзначных кода для М и О заняли бы всю ветвь 1… и не оставили места К.
Ответ: 7
Слово ТОСТ
Все буквы русского алфавита закодированы двоичным кодом, удовлетворяющим условию Фано. Известны коды Н — 00, О — 011, С — 101. Какова наименьшая длина записи слова ТОСТ?
Введите число.
Подсказка
Все остальные буквы алфавита — одна резервная ветвь с частотой 0.
Решение
Т встречается дважды и получает свободный код 11, остальные буквы — в резервных ветвях 010 и 100; 2 · 2 + 3 + 3 = 10.
Ответ: 10
Слово КЕКЛЕТ
Сообщения содержат только буквы А, Е, К, Л, Р, Т. Используется двоичный код, удовлетворяющий условию Фано: А — 01, Р — 100. Какова наименьшая длина записи слова КЕКЛЕТ?
Введите число.
Подсказка
Частоты: К и Е — по 2, Л и Т — по 1.
Решение
Свободны 00, 11, 101. К и Е встречаются по два раза и получают 00 и 11, Л и Т — 1010 и 1011; 2 · 2 + 2 · 2 + 4 + 4 = 16.
Ответ: 16
Слово ЖАБА
По каналу связи передаются сообщения, содержащие только семь букв: А, Б, В, Г, Д, Е, Ж. Для передачи используется двоичный код, удовлетворяющий условию Фано. Кодовые слова для некоторых букв известны: Б — 010, В — 011, Г — 10. Какое наименьшее количество двоичных знаков потребуется для кодирования слова ЖАБА?
Введите число.
Подсказка
Д и Е в слове нет, но им нужны места.
Решение
Свободны 00 и 11; А — 00, Ж — 110, резерв для Д и Е — 111; 2 · 2 + 3 + 3 = 10.
Ответ: 10
Слово КОЛОТОК
Для кодирования последовательности, состоящей из букв К, Л, О, Т, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Букве К соответствует код 1, букве Т — код 01. Какова наименьшая суммарная длина кодовых слов для всех букв в слове КОЛОТОК?
Введите число.
Подсказка
К и Т заданы, О встречается трижды.
Решение
Свободна только ветвь 00; О и Л получают 000 и 001; 2 · 1 + 3 · 3 + 3 + 2 = 16.
Ответ: 16
Частоты 6, 2, 1, 1
Заданы Д — 01, Е — 10, Ж — 110. Остальные буквы — А, Б, В, Г. В сообщении А встречается 6 раз, Б — 2 раза, В и Г — по одному. Других букв в сообщении нет. Найди минимальную длину сообщения.
Введите число.
Подсказка
Сравни два варианта: А занимает вершину 00 целиком или 00 делится на две.
Решение
А — 00, Б — 1110, В — 11110, Г — 11111; 6 · 2 + 2 · 4 + 1 · 5 + 1 · 5 = 30. Без кода длины 2 не больше двух новых кодов получают длину 3, и лучшая оценка 6 · 3 + 2 · 3 + 1 · 4 + 1 · 4 = 32. Здесь кратчайший код частой букве выгоден — решение определяется всей совокупностью частот.
Ответ: 30
Слово ПАСПОРТ
По каналу связи передаются сообщения, содержащие только буквы А, О, П, Р, С, Т. Для передачи используется двоичный код, удовлетворяющий условию Фано. Кодовые слова для некоторых букв известны: Т — 001, С — 01. Для четырёх оставшихся букв кодовые слова неизвестны. Какое наименьшее количество двоичных знаков потребуется для кодирования слова ПАСПОРТ?
Введите число.
Подсказка
Отдать П код 1 — не лучший вариант.
Решение
Свободны 000 и 1. Отдать П код 1 — тогда А, О, Р уходят в 000…, длина 21. Лучше разделить 1: П — 10, две буквы — 110, 111, одна — 000; 5 + 2 · 2 + 3 + 3 + 3 = 18.
Ответ: 18
Слово МАКАРОНЫ
По каналу связи передаются сообщения, содержащие только буквы А, К, М, Н, О, Р, Ы. Используется двоичный код, удовлетворяющий условию Фано. Известны коды Р — 1100 и Н — 1111. Какое наименьшее количество двоичных знаков потребуется для кодирования слова МАКАРОНЫ?
Введите число.
Подсказка
Кратчайший код второй по частоте букве тоже может удлинить запись.
Решение
Свободны 0, 10, 1101, 1110. Если А — 0, а М — кратчайший свободный 10, то К, О, Ы остаются 1101 и 1110…, и длина 26. Выгоднее разделить 10: А — 0, М — 100, К — 101, О — 1101, Ы — 1110; вместе с Р и Н 2 · 1 + 3 + 3 + 4 + 4 + 4 + 4 = 24.
Ответ: 24
Слово КАРКАС
Сообщения содержат только буквы А, К, Р, С, Я. Используется двоичный код, удовлетворяющий условию Фано; код буквы Р — 11. Какое наименьшее количество двоичных знаков потребуется для кодирования слова КАРКАС?
Введите число.
Подсказка
Не забудь резерв для Я и сравни два варианта дерева.
Решение
Свободны 0 и 10; К и А встречаются по два раза, С — один, ещё нужен резерв для Я. Если К — 0, остальным трём местам остаётся ветвь 10…, и длина 14. Лучше разделить 0: К — 00, А — 01, С — 100, резерв — 101; 2 · 2 + 2 · 2 + 3 + 2 = 13.
Ответ: 13