Курс№4. Условие Фано0%
Теория · номер 4 из 27

Условие Фано

Буквы кодируются двоичными словами разной длины, и ни одно слово не должно быть началом другого. Этот номер решаем руками. Рисуем дерево, находим свободные места и выбираем самые короткие.

6 разделов~30 минут1 первичный балл
  1. 1Что проверяет номер
  2. 2Дерево кодов
  3. 3Сумма длин для оставшихся букв
  4. 4Длина слова и код одной буквы
  5. 5Ловушки перед экзаменом
  6. 6Домашка
Раздел 1 из 6

Что проверяет номер

Буквы кодируются двоичными словами разной длины. Чтобы сообщение разбиралось однозначно, нужно условие Фано: никакое кодовое слово не является началом другого. Коды 0 и 01 вместе нельзя: встретив 01, непонятно, это одна буква или 0 и что-то ещё.

Часть кодов уже дана. Для остальных букв надо подобрать коды так, чтобы получилось как можно короче. Виды задач различаются тем, что именно просят:

Что просятЧто делаем
Наименьшая суммарная длина кодов оставшихся буквБерём самые короткие свободные места
Наименьшая длина закодированного словаСамой частой букве самый короткий код
Кратчайший код для одной буквыСамое короткое свободное место, при равенстве наименьшее число

Все три вида решаются одним рисунком, и код здесь не нужен.

Раздел 2 из 6

Дерево кодов

Рисуем двоичное дерево: из каждого узла левая ветка это 0, правая это 1. Каждый узел соответствует слову, которое читается по веткам от вершины.

Условие Фано на дереве выглядит просто: кодовые слова должны быть листьями. Если слово заняло узел, то всё ниже него закрыто.

Пример. Заняты слова 01, 100 и 111, нужно закодировать ещё 3 буквы.

1001010101···
Закрашенные узлы заняты, ниже них идти нельзя. Зелёные пунктирные это свободные места: 00, 101 и 110.

Порядок действий:

  1. Ставим занятые слова как листья.
  2. Находим свободные узлы. Чем выше узел, тем короче слово.
  3. Заполняем свободные узлы, начиная с самых высоких.

Здесь нужно ровно 3 места, и их как раз 3: длины 2, 3 и 3, сумма 8.

Попробуй самучебная задача

Заняты слова 00, 01, 101 и 110. Нарисуй дерево. Какой длины самое короткое слово, которое ещё можно добавить?

Раздел 3 из 6

Сумма длин для оставшихся букв

Признак: «наименьшая возможная суммарная длина кодовых слов для остальных букв». Если свободных мест столько же, сколько букв, просто складываем их длины, как в примере выше. Сложнее, когда мест не хватает.

Мест меньше, чем букв

Свободный узел можно разделить на два: вместо него появятся два слова на один знак длиннее. Например, занято 1 и 01, а нужно 3 буквы. Свободен только узел 00. Делим его на 000 и 001, а один из них ещё раз:

10100101··абв
Свободный узел 00 поделили, потом поделили 001. Получились три слова длиной 3, 4 и 4, сумма 11.

Какой узел делить

Если свободных узлов несколько, делим самый короткий: так сумма вырастет меньше всего. Занято 0 и 100, нужно 3 буквы, свободны 11 и 101. Делим 11: получаем 110, 111 и 101, сумма 9. Если поделить 101, выйдет 11, 1010 и 1011, сумма 10.

Попробуй самучебная задача

Заняты слова 11, 100 и 0. Нужно закодировать ещё 2 буквы. Какова наименьшая суммарная длина их кодов?

Раздел 4 из 6

Длина слова и код одной буквы

Наименьшая длина закодированного слова

Признак: «какое количество двоичных знаков требуется для кодирования слова». Теперь важно, сколько раз встречается каждая буква. Самая частая получает самый короткий код. Буквы, которых нет в слове, получают самые длинные места, их длина считается ноль раз.

Пример. Известно А = 1, Б = 000, В = 0010. Ещё нужны Г, Д, Е. В слове Д встречается три раза, Е два раза, а Г, А и Б по одному.

Свободны узлы 01 и 0011, а букв три, значит, один узел придётся делить. Сравним два варианта:

Как делимД (3 раза)Е (2 раза)Г (1 раз)Сумма
Делим 01010, длина 3011, длина 30011, длина 49 + 6 + 4 = 19
Делим 001101, длина 200110, длина 500111, длина 56 + 10 + 5 = 21
1010001101АБДЕВГ
Лучший вариант: поделили узел 01, зелёные узлы это новые коды Д, Е и Г.

Берём 19 и прибавляем известные буквы: А один раз длиной 1 и Б один раз длиной 3. Ответ 23.

Здесь выгоднее поделить короткий узел, но так бывает не всегда. Если одна буква встречается намного чаще других, ей лучше оставить короткий узел целым и делить длинный. Занято 0 и 100, свободны 11 и 101, в слове Д пять раз, Е и Г по одному. Делим 11: все три кода длиной 3, сумма 5 · 3 + 3 + 3 = 21. Делим 101: Д = 11, сумма 5 · 2 + 4 + 4 = 18. Поэтому в задаче на длину слова считай все варианты деления.

Кратчайший код для одной буквы

Признак: «укажите кратчайшее кодовое слово для буквы». Находим самый высокий свободный узел и читаем слово по веткам. Если таких узлов несколько, в условии обычно просят код с наименьшим числовым значением: на дереве это самый левый из них. Заняты 00, 01, 101 и 110, свободны 100 и 111, значит, ответ 100.

Обратное условие Фано

Признак: «никакое кодовое слово не является концом другого». Разверни все слова задом наперёд и рисуй обычное дерево. Найденный код в конце тоже разверни обратно.

Попробуй самучебная задача

Известно: А = 00, Б = 01, В = 10. Ещё нужны Г и Д. В слове Г встречается три раза, Д один раз, А и Б по два раза, В ни разу. Какова наименьшая длина закодированного слова?

Раздел 5 из 6

Ловушки перед экзаменом

ЛовушкаКак не попасться
Не учли буквы, которых нет в словеОни считаются ноль раз, им достаются самые длинные места, но место занимают
Самый короткий код достался редкой буквеЧастые буквы ставим на самые высокие узлы
Новое слово стало началом занятогоНовые слова только в свободных узлах, ниже занятых и выше занятых нельзя
Поделили не тот узелДля суммы длин делим самый короткий. Для длины слова считаем все варианты
Спутали сумму длин и длину словаЧитай, что просят: суммарную длину кодов или длину закодированного слова
Забыли про известные буквы в словеИх длины тоже входят в длину слова
Раздел 6 из 6

Домашка

Шесть задач с настоящих экзаменов и из банка ФИПИ. Решай на листе бумаги и вписывай ответ в карточку.

Перед тем как считать, сделай три вещи:

Где теряют балл в этих задачах

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

Ещё задачи этого вида лежат в разделе «Задания», №4.

Задачи «Попробуй сам» учебные, в домашке задачи с настоящих экзаменов и из банка ФИПИ. Рисуй деревья на листе бумаги, как на экзамене.