К содержанию

Подтема 4 из 4

Длина закодированного слова

Как сделать закодированное слово как можно короче: частым буквам — короткие коды, но не всегда.

Длина закодированного слова

Длина закодированного слова — сумма длин кодов всех его букв с повторами, поэтому частым буквам выгодно давать короткие коды. Это самый частый тип задания 4 последних лет.

Главный пример страницы — слово МОЛОКО: сообщения состоят из букв М, О, Л, К, Н, заданы коды О — 00 и К — 01. Сначала разберёмся, что именно считать.

Что уменьшать

Сначала пойми, какую величину нужно сделать наименьшей. Внешне похожие задачи могут требовать разных вычислений:

Что требуетсяЧто считаем
Длина кода одной буквыКоличество знаков только в её коде
Сумма длин нескольких кодовых словДлину каждого указанного кода по одному разу
Сумма длин всех кодовых словДлины кодов всех букв алфавита по одному разу
Длина закодированного сообщенияДлины кодов с учётом всех повторений букв

Например, для таблицы А — 0, Б — 10, В — 110, Г — 111 сумма длин всех кодов равна 1 + 2 + 3 + 3 = 9, а длина сообщения АААБВ — 1 + 1 + 1 + 2 + 3 = 8. Это разные величины.

Частоты и длины

Длина сообщения — сумма произведений частот букв на длины их кодов. Чтобы быстро считать длину длинного сообщения, удобно сначала подсчитать, сколько раз встречается каждая буква. Количество появлений буквы будем называть её частотой в данном сообщении. Для АААБВ:

БукваЧастотаДлина кодаВклад в длину сообщения
А313 · 1 = 3
Б121 · 2 = 2
В131 · 3 = 3
Г030 · 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.

Ветвь 0 занята кодами О и К. В ветви 1 нужны три места — для М, Л и для Н, которой нет в слове: 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).

Обе разности неотрицательны, поэтому результат тоже неотрицателен.

Это относится к буквам, коды которых можно выбирать. Заданные в условии соответствия переставлять нельзя.

Получается порядок действий для наименьшей длины слова:

  1. Посчитать частоты букв слова и вклад букв с заданными кодами.
  2. Найти свободные ветви. Буквам вне слова, если они есть, нужно одно резервное место.
  3. Буквам слова по убыванию частоты давать самый короткий свободный код, после которого остаётся место всем остальным буквам и резерву.
  4. Проверить, не выгоднее ли разделить короткую вершину, — об этом следующий раздел.

Короткий не всегда выгоден

Самый короткий код для частой буквы иногда ухудшает весь результат. Поэтому, когда у частой буквы есть выбор, рисуют оба варианта дерева и сравнивают длины слова. Пример: алфавит из семи букв А, Б, В, Г, Д, Е, Ж, заданы Д — 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.

Слева А заняла вершину 00, и три буквы ушли глубоко в ветвь 111: длина 40. Справа вершина 00 разделена на две буквы, ветвь 111 — тоже: длина 37.

Код самой частой буквы стал длиннее, но всё сообщение сократилось: 4 · 3 + 3 · 3 + 2 · 4 + 2 · 4 = 37. Почему? Код А удлинился на один знак, и это добавило 4 бита — по одному на каждое появление. А коды Б, В, Г укоротились на один знак каждый и сэкономили 3 + 2 + 2 = 7 бит. Мы добавили четыре бита, а сэкономили семь.

Правило: если частой букве можно отдать короткую свободную вершину, нарисуй два варианта — буква занимает вершину целиком или вершина делится на две — и сравни длины слова. Разделить вершину выгодно, когда буквы, которые поднимутся выше, вместе встречаются чаще, чем буква, которая опустится на уровень.

Итого

  • Величинакод одной буквы, сумма длин или длина слова — разные ответы
  • Длина словасумма «частота × длина кода»
  • Буква вне словачастота 0, но место в дереве нужно
  • Частым — короткиена готовых местах; заданные коды не переставляют
  • Короткая вершинасравни с вариантом, где она разделена

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Коды: А — 0, Б — 10. Сколько знаков в записи слова АББА?
ОтветСкрыть ответ
Ответ
6: 1 + 2 + 2 + 1 — каждое появление буквы считается.
Вопрос 2
Свободны места длины 2 и 3. Буква К встречается в слове 3 раза, Л — 2 раза. Как назначить коды?
ОтветСкрыть ответ
Ответ
К — короткое место: 3 · 2 + 2 · 3 = 12, а наоборот 3 · 3 + 2 · 2 = 13.
Вопрос 3
Буквы Н нет в слове, но она есть в алфавите. Нужно ли оставлять ей место в дереве?
ОтветСкрыть ответ
Ответ
Да: код нужен каждой букве алфавита. Её частота 0, поэтому длину слова она не меняет, но свободную вершину занимает.
Вопрос 4
Самой частой букве можно отдать свободную вершину 00 или разделить её на 000 и 001. Как решить, что выгоднее?
ОтветСкрыть ответ
Ответ
Нарисовать оба варианта дерева, расставить буквы по частотам и сравнить длины слова — иногда короче получается с разделённой вершиной.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Длина записи АББАВ

Задана таблица А — 0, Б — 10, В — 110, Г — 111. Сколько двоичных знаков нужно для записи слова АББАВ?

Введите число.

Две разные величины

Для таблицы А — 0, Б — 10, В — 110, Г — 111 найди сумму длин всех кодов и длину записи слова ВАГА.

Введите два числа через пробел: сумму длин, затем длину записи слова.

Два места и две буквы

Свободны два места — длины 2 и длины 3. Буква К встречается в сообщении 4 раза, буква Л — один раз. Какая наименьшая длина записи этих пяти букв?

Введите число.

Алфавит содержит только А, М, О, К. Известно: А — 0. Какова минимальная длина записи слова МОМ?

Введите число.

Все буквы русского алфавита закодированы двоичным кодом, удовлетворяющим условию Фано. Известны коды Н — 00, О — 011, С — 101. Какова наименьшая длина записи слова ТОСТ?

Введите число.

Слово КЕКЛЕТ

Сообщения содержат только буквы А, Е, К, Л, Р, Т. Используется двоичный код, удовлетворяющий условию Фано: А — 01, Р — 100. Какова наименьшая длина записи слова КЕКЛЕТ?

Введите число.

По каналу связи передаются сообщения, содержащие только семь букв: А, Б, В, Г, Д, Е, Ж. Для передачи используется двоичный код, удовлетворяющий условию Фано. Кодовые слова для некоторых букв известны: Б — 010, В — 011, Г — 10. Какое наименьшее количество двоичных знаков потребуется для кодирования слова ЖАБА?

Введите число.

Слово КОЛОТОК

Для кодирования последовательности, состоящей из букв К, Л, О, Т, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Букве К соответствует код 1, букве Т — код 01. Какова наименьшая суммарная длина кодовых слов для всех букв в слове КОЛОТОК?

Введите число.

Заданы Д — 01, Е — 10, Ж — 110. Остальные буквы — А, Б, В, Г. В сообщении А встречается 6 раз, Б — 2 раза, В и Г — по одному. Других букв в сообщении нет. Найди минимальную длину сообщения.

Введите число.

По каналу связи передаются сообщения, содержащие только буквы А, О, П, Р, С, Т. Для передачи используется двоичный код, удовлетворяющий условию Фано. Кодовые слова для некоторых букв известны: Т — 001, С — 01. Для четырёх оставшихся букв кодовые слова неизвестны. Какое наименьшее количество двоичных знаков потребуется для кодирования слова ПАСПОРТ?

Введите число.

По каналу связи передаются сообщения, содержащие только буквы А, К, М, Н, О, Р, Ы. Используется двоичный код, удовлетворяющий условию Фано. Известны коды Р — 1100 и Н — 1111. Какое наименьшее количество двоичных знаков потребуется для кодирования слова МАКАРОНЫ?

Введите число.

Сообщения содержат только буквы А, К, Р, С, Я. Используется двоичный код, удовлетворяющий условию Фано; код буквы Р — 11. Какое наименьшее количество двоичных знаков потребуется для кодирования слова КАРКАС?

Введите число.