Подтема 3 из 4
Место для всех букв и сумма длин
Почему место нужно оставить каждой букве и как получить наименьшую сумму длин кодов — и ответ задачи темы.
Код каждой букве
Код нужен каждой букве алфавита, даже если в сообщении её нет: выбирая код одной буквы, нельзя занимать место, нужное остальным. Из этого же правила получается наименьшая сумма длин кодов.
Работаем с кодами А — 00, Б — 01, В — 10: в дереве свободна одна ветвь 11…. Сначала найдём в ней код Г, когда в алфавите есть ещё буква Д, затем — наименьшую сумму длин для шести букв.
Места не хватит
Код может подходить ко всем заданным кодам и всё равно быть неверным, если остальным буквам не хватит места. Пусть сообщения могут содержать буквы А, Б, В, Г, Д. Известно: А — 00, Б — 01, В — 10. Нужно подобрать кратчайший код Г.
На первый взгляд подходит Г — 11: он не конфликтует с 00, 01 и 10. Но тогда таблица займёт всё дерево: всё, что начинается с 0, занято буквами А и Б, с 10 — буквой В, с 11 — буквой Г. Для Д не осталось ни одного возможного кода. Поэтому Г — 11 — недопустимый выбор для полного алфавита задачи.
Нужно разделить последнюю свободную ветвь: Г — 110, Д — 111. Теперь всё корректно.
Кратчайший код Г с учётом существования Д — 110.
Код может быть совместим со всеми уже заданными кодами, но при этом не позволять закончить таблицу для остальных букв.
Поэтому проверка нового кода состоит из двух частей:
- он не нарушает условие Фано с уже назначенными кодами;
- после его выбора можно назначить коды всем оставшимся буквам.
В задачах, где кодируются все буквы русского алфавита, это особенно важно. Если в сообщении встречаются только три буквы, остальные всё равно нельзя вычеркнуть из алфавита.
Одной ветви хватает
Если длины кодов не ограничены, одной свободной ветви хватает на любое число оставшихся букв. Пусть теперь кодируется весь русский алфавит, а А, Б, В и Г уже получили коды 00, 01, 10, 110. Двадцать девять оставшихся букв не нужно сразу рисовать в листьях: им хватит одной свободной ветви 111….
Свободную ветвь 111 можно разделить на сколько угодно кодов:
- 2
1110,1111- 3
1110,11110,11111- 4
11100,11101,11110,11111
В общем случае можно спуститься достаточно глубоко и выбрать нужное количество одинаковых по длине продолжений. Если нужно разместить 20 букв, достаточно добавить к свободному началу пять знаков: получится 2⁵ = 32 варианта.
Здесь нет противоречия с условием Фано: сам резервируемый префикс 111 не назначается отдельной букве. Он обозначает место, внутри которого будут построены коды остальных букв.
Наименьшая сумма длин
Наименьшую сумму длин получают, разветвляя свободную ветвь ровно столько раз, сколько нужно букв. Пусть алфавит содержит шесть букв: А, Б, В, Г, Д, Е. Известно: А — 00, Б — 01, В — 10. Нужно найти наименьшую сумму длин кодов всех шести букв.
Для трёх оставшихся букв свободна только ветвь 11…. Использовать сам код 11 нельзя: тогда две другие буквы останутся без кодов. Разделим ветвь: 110 и 111 — два места, а нужны три. Разделим ещё одно из них:
- Свободные вершины: 11. Каждая — одно место; нужно 3 места.
- Мест не хватает: делим самую короткую вершину 11 на 110 и 111. Место длины 2 заменили двумя длины 3.
- Мест не хватает: делим самую короткую вершину 111 на 1110 и 1111. Место длины 3 заменили двумя длины 4.
- Буквам — самые короткие места. Сумма длин новых кодов 11.
Получаем Г — 110, Д — 1110, Е — 1111. Длины новых кодов 3, 4, 4, их сумма 11. Сумма длин всех шести кодов: 2 + 2 + 2 + 3 + 4 + 4 = 17.
Тонкости:почему меньше нельзя
- Кода длины 1 для новых букв нет.
- Единственный свободный код длины 2 —
11. Его нельзя занять одной буквой, потому что нужно разместить три. - На глубине 3 есть только два места:
110и111. Если занять оба, третьей букве не останется места.
Следовательно, среди трёх новых кодов не больше одного может иметь длину 3, остальные имеют длину не меньше 4. Поэтому сумма новых длин не меньше 3 + 4 + 4 = 11. Мы построили коды, для которых достигается именно 11. Значит, меньшая сумма невозможна.
Обрати внимание, какую сумму спрашивают. Сумма длин всех кодов — это заданные коды плюс новые (здесь 6 + 11 = 17); сумма длин оставшихся букв — только новые (11).
Несколько свободных ветвей
Если свободных ветвей несколько, делят самую короткую свободную вершину. Разделить вершину длины d — значит вместо одного места длины d получить два места длины d + 1. Чем короче делимая вершина, тем короче оба новых места.
Изменим один код примера: пусть В — 100 вместо 10. Теперь свободны две ветви разной длины: 101… и 11…. Для Г, Д, Е нужно три места, а их два — делим более короткую вершину 11:
- Свободные вершины: 11, 101. Каждая — одно место; нужно 3 места.
- Мест не хватает: делим самую короткую вершину 11 на 110 и 111. Место длины 2 заменили двумя длины 3.
- Буквам — самые короткие места. Сумма длин новых кодов 9.
Места 101, 110, 111 — длины 3, 3, 3, сумма новых длин 9. Если бы разделили длинную 101, получили бы 2 + 4 + 4 = 10 — хуже.
Иногда выгодно разделить короткую вершину, даже когда мест уже хватает. Пусть заданы А — 01, Б — 10, В — 110, Г — 1110, Д — 11110, а коды нужны ещё двум буквам Е и Ж. Свободны 00… и 11111…: два места длин 2 и 5, сумма 7. Но если разделить 00 на 000 и 001, получим 3 + 3 = 6.
- Свободные вершины: 00, 11111. Каждая — одно место; нужно 2 места.
- Места хватает, но самое длинное нужное место длиннее 00 на 3 и больше: выгоднее разделить 00, а длинное место не брать.
- Буквам — самые короткие места. Сумма длин новых кодов 6.
Поэтому, когда свободные вершины сильно различаются по длине, сравни два варианта: занять каждую одной буквой или разделить короткую.
Тонкости:когда делить короткую вершину
Два места длин d (самое короткое) и D (самое длинное из нужных) дают сумму d + D; если вместо них разделить короткое, получится 2(d + 1) = 2d + 2. Деление выгодно, когда D ≥ d + 3, и ничего не меняет при D = d + 2.
Итого
- Место для всехновый код не занимает последнюю свободную ветвь, пока остались буквы
- Одна свободная ветвьвмещает сколько угодно букв, если длины не ограничены
- Сумма длинделят самую короткую свободную вершину
- Короткая вершинаиногда её выгодно разделить, даже когда мест хватает
- Сумма всех кодоввключает и заданные коды
Проверьте себя
Ответь сначала сам, потом открой ответ.
00, Б — 01, В — 10. Можно ли дать Г код 11?ОтветСкрыть ответ
11 — последняя свободная вершина, и Д не останется места. Г — 110, Д — 111.111…. Хватит ли её остальным двадцати девяти буквам?ОтветСкрыть ответ
1, Б — 01. Какова наименьшая сумма длин кодов ещё четырёх букв?ОтветСкрыть ответ
00; делим её на 000 и 001, а обе ещё раз — четыре кода длины 4. Вариант с длинами 3, 4, 5, 5 даёт 17.0, Б — 100. Какова наименьшая сумма длин кодов ещё трёх букв?ОтветСкрыть ответ
101 и 11. Мест нужно три — делим более короткую 11 на 110 и 111: три кода длины 3.00, Б — 01, В — 10, найдены Г — 110, Д — 111. Чему равна сумма длин всех пяти кодов?ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Место для Г
Алфавит содержит только А, Б, В, Г. Известно: А — 1, Б — 01. Найди кратчайший код В. При нескольких вариантах выбери наименьший по числовому значению.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Код В не должен занять последнюю свободную ветвь.
Решение
Свободна только ветвь 00; код 00 оставил бы Г без места, поэтому В — 000, Г — 001.
Ответ: 000
Сумма длин четырёх кодов
Алфавит содержит только А, Б, В, Г. Код А равен 1. Найди наименьшую сумму длин кодов всех четырёх букв.
Введите число.
Подсказка
Разветвляй свободную ветвь столько раз, сколько нужно букв.
Решение
Три буквы в ветви 0… получают длины 2, 3, 3, например Б — 00, В — 010, Г — 011; 1 + 2 + 3 + 3 = 9.
Ответ: 9
Сумма длин семи кодов
Алфавит содержит семь букв. Известно: А — 0, Б — 10. Найди наименьшую сумму длин кодов всех семи букв.
Введите число.
Подсказка
Пять букв в ветви 11.
Решение
Пять букв в ветви 11… получают длины 4, 4, 4, 5, 5; 1 + 2 + 22 = 25.
Ответ: 25
Три буквы в двух ветвях
Заданы А — 00, Б — 011, В — 10. Найди наименьшую сумму длин кодов ещё трёх букв Г, Д, Е.
Введите число.
Подсказка
Делят самую короткую свободную вершину.
Решение
Свободны 010 и 11; делим более короткую 11, места 010, 110, 111.
Ответ: 9
Две буквы: короткая ветвь выгоднее
Заданы А — 1, Б — 011, В — 0101, Г — 01001. Найди наименьшую сумму длин кодов ещё двух букв Д и Е.
Введите число.
Подсказка
Сравни два варианта: по букве в каждой ветви или обе буквы в короткой.
Решение
Свободны 00 и 01000; 2 + 5 = 7, а 000 и 001 дают 3 + 3 = 6.
Ответ: 6
Кратчайший код Д в большом алфавите
Все буквы русского алфавита закодированы двоичным кодом, удовлетворяющим условию Фано. Известны коды А — 00, Б — 010, В — 011, Г — 10. Найди кратчайший код буквы Д; если вариантов несколько, выбери наименьший по числовому значению.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Остальным буквам алфавита нужна хотя бы одна свободная ветвь.
Решение
Свободна только ветвь 11, код 11 не оставил бы места остальным буквам.
Ответ: 110
Сумма длин шести кодов
Для кодирования некоторой последовательности, состоящей из букв К, Л, М, Н, О, П, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв К, Л, М использовали кодовые слова 0, 100, 110. Какова наименьшая возможная сумма длин всех шести кодовых слов?
Введите число.
Подсказка
Сначала свободные ветви, потом их разветвление.
Решение
Свободны 101 и 111, три буквы получают длины 3, 4, 4; 1 + 3 + 3 + 11 = 18.
Ответ: 18
Две оставшиеся буквы
По каналу связи передаются сообщения, содержащие только восемь букв: А, Б, В, Г, Д, Е, Ж, З. Используется двоичный код, удовлетворяющий условию Фано. Известны коды: А — 000, Б — 001, В — 0100, Г — 011, Д — 10, Е — 1101. Какое наименьшее количество двоичных знаков потребуется для кодирования двух оставшихся букв? В ответе запишите суммарную длину кодовых слов для букв Ж и З.
Введите число.
Подсказка
Сравни свободные ветви по длине.
Решение
Свободны 0101, 1100 и 111; лучшие места — 111 и одно из мест длины 4, 3 + 4 = 7.
Ответ: 7
Кратчайший код П с местом для Р
Для кодирования некоторой последовательности, состоящей из букв К, Л, М, Н, П, Р, решили использовать неравномерный двоичный код, удовлетворяющий условию Фано. Для букв К, Л, М, Н использовали кодовые слова 000, 001, 01, 10. Для букв П и Р коды неизвестны. Укажи кратчайшее возможное кодовое слово для буквы П. Если таких кодов несколько, укажи код с наименьшим числовым значением.
Введите кодовое слово (последовательность из 0 и 1).
Подсказка
Код П не должен занять последнюю свободную ветвь.
Решение
Свободна только ветвь 11, код 11 оставил бы Р без места.
Ответ: 110