Кодирование информации · Блок 2§7
SilverTests.ru · Подготовка к ИТМОТеория + паттерны + задания
Неравномерное кодирование
Условие Фано, кодовое дерево, неравенство Крафта
1Равномерное vs неравномерное
Равномерное: все коды одной длины K = ⌈log₂N⌉. Просто, но расточительно, если символы встречаются с разной частотой.
Неравномерное: частые символы — короткие коды, редкие — длинные. Экономит место, но появляется проблема: как при декодировании понять, где кончается один код?
проблема
// Пусть A=0, B=01, C=1
// Строка 001 — это:
A A C (0 | 0 | 1) или A B (0 | 01)?
// Двусмысленность! Код нельзя использовать.
2Условие Фано (префиксный код)
пример
// Удовлетворяет Фано:
A = 0 B = 10 C = 110 D = 111
// 0 не начало 10, 110, 111 ✓
// 10 не начало 0, 110, 111 ✓
// НЕ удовлетворяет:
A = 0 B = 01
// 0 — начало 01 ✗
Обратное условие Фано (постфиксный код): никакой код не является концом другого. Тоже обеспечивает однозначное декодирование (читаем справа налево). На ИТМО встречается реже, но в задачах ЕГЭ бывает.
3Кодовое дерево
Каждый префиксный код — это двоичное дерево. Из каждого узла: влево — «0», вправо — «1». Символы — только в листьях.
дерево
(корень)
/ \
0 1
[A] / \
0 1
[B] / \
0 1
[C] [D]
// A=0, B=10, C=110, D=111
Как использовать для решения
Рисуем дерево, размещаем уже известные коды как листья. Свободные листья — это возможные коды для оставшихся символов.
Правило: если узел — лист (символ), то от него НЕ идут ветви вниз. Если узел — внутренний, то он ОБЯЗАН иметь обоих потомков (иначе код неоптимален).
4Неравенство Крафта
Критерий существования префиксного кода с заданными длинами:
примеры
// Длины 1, 2, 3, 3:
2⁻¹ + 2⁻² + 2⁻³ + 2⁻³ = 0.5 + 0.25 + 0.125 + 0.125 = 1.0 ≤ 1 ✓
// Длины 1, 1, 2, 3:
2⁻¹ + 2⁻¹ + 2⁻² + 2⁻³ = 0.5 + 0.5 + 0.25 + 0.125 = 1.375 > 1 ✗
// Длины 2, 2, 2, 3, 3:
3×2⁻² + 2×2⁻³ = 0.75 + 0.25 = 1.0 ≤ 1 ✓
Смысл: каждый код длины l «занимает» долю 2⁻ˡ от пространства кодов. Сумма долей не может превышать 1. При равенстве — код полный и оптимальный.
Расширение Макмиллана
Неравенство Крафта доказывается для префиксных кодов. Но теорема Макмиллана утверждает: то же самое неравенство выполняется для любого однозначно декодируемого кода — не обязательно префиксного.
Следствие: если набор длин не проходит проверку ∑ 2⁻ˡⁱ ≤ 1, то с этими длинами невозможен никакой однозначно декодируемый код — ни префиксный, ни постфиксный, ни какой-либо другой. Переход к непрефиксным кодам не расширяет множество допустимых длин.
На ИТМО: если в задаче спрашивают «можно ли построить однозначно декодируемый код?» (без слова «префиксный»), ответ всё равно определяется неравенством Крафта.
5Типовые задачи
Задача 1: «Найти кратчайший код для буквы X»
алгоритм
1. Нарисовать кодовое дерево для уже известных кодов
2. Найти все свободные листья на каждом уровне
3. Кратчайший свободный лист — ответ
// Пример: A=00, B=010, C=111. Найти кратчайший D.
// (корень)
// / \
// 0 1
// / \ / \
// 00 01 [10] 11
// [A] / \ / \
// 010 [011] 110 111
// [B] [C]
// Свободные: 10 (ур.2), 011 (ур.3), 110 (ур.3)
// Кратчайший: 10 (длина 2)
Задача 2: «Декодировать сообщение»
метод
// Код: A=0, B=10, C=110, D=111
// Сообщение: 01011110
Читаем слева, ищем совпадение:
0 → A | 10 → B | 111 → D | 10 → B
Ответ: ABDB
Задача 3: «Минимальная средняя длина» (Хаффман)
алгоритм Хаффмана
// Частоты: A=1/2, B=1/4, C=1/8, D=1/8
1. Соединяем два самых редких: C+D → узел (1/4)
2. Теперь: A=1/2, B=1/4, CD=1/4
3. Соединяем B+CD → узел (1/2)
4. Соединяем A + BCD → корень
Коды: A=0, B=10, C=110, D=111
Средняя длина: 1/2×1 + 1/4×2 + 1/8×3 + 1/8×3 = 1.75 бит
// Равномерный код: 2 бит. Экономия: 12.5%
Хаффман на ИТМО нужен редко (чаще на ЕГЭ №4), но понимание помогает в задачах на оценку минимального объёма.
6Кодирование с ограничениями (Бельчонок)
На Бельчонке и ИТМО встречается тип задачи: «Сколько двоичных строк длины n удовлетворяют ограничению?» Это на стыке кодирования и комбинаторики.
Задача: строки без двух единиц подряд
рекурсия
// f(n) = число двоичных строк длины n без «11»
// Последний символ = 0: предыдущие n−1 — любая допустимая → f(n−1)
// Последний символ = 1: предпоследний = 0, остаток n−2 → f(n−2)
f(n) = f(n−1) + f(n−2) // числа Фибоначчи!
f(1) = 2 // «0», «1»
f(2) = 3 // «00», «01», «10» (не «11»)
f(3) = 5 // «000», «001», «010», «100», «101»
f(4) = 8
f(5) = 13
// Бит на кодовое слово: ⌈log₂(f(n))⌉
// При n = 5: ⌈log₂(13)⌉ = 4 бита
Обобщение: строки без k единиц подряд
формула
// g(n) = число строк длины n без k единиц подряд
// g(n) = g(n−1) + g(n−2) + … + g(n−k)
// Пример: без трёх единиц подряд (k = 3)
g(n) = g(n−1) + g(n−2) + g(n−3)
g(1) = 2, g(2) = 4, g(3) = 7
g(4) = 7 + 4 + 2 = 13
g(5) = 13 + 7 + 4 = 24
Связь с кодированием: если передатчик не может отправить k единиц подряд (физическое ограничение канала), то из 2ⁿ возможных строк реально доступно только g(n). Ёмкость канала = log₂(g(n))/n бит на такт.
Другие типовые ограничения
| Ограничение |
Рекурсия |
Начальные значения |
| Без «11» |
f(n) = f(n−1) + f(n−2) |
f(1)=2, f(2)=3 |
| Без «00» |
То же (симметрия 0↔1) |
f(1)=2, f(2)=3 |
| Чётное число единиц |
Ровно 2ⁿ⁻¹ |
Всегда половина |
| Не более m единиц |
∑ C(n,k) для k = 0..m |
— |
7q-ичные коды и обобщение Крафта
Всё вышесказанное легко обобщается на алфавит из q символов (не только 0/1):
пример
// Троичный код (q = 3): длины 1, 1, 2, 2, 2
2 × 3⁻¹ + 3 × 3⁻² = 2/3 + 3/9 = 2/3 + 1/3 = 1.0 ≤ 1 ✓
// Пример кода: A=0, B=1, C=20, D=21, E=22
// Это префиксный троичный код ✓
На ИТМО q-ичные коды встречаются в задаче вида: «Светофор показывает один из 3 цветов. Какова минимальная длина последовательности для кодирования N сообщений?»
8Чек-лист
| № |
Что проверить |
| 1 |
Ни один код не начинается с другого кода → условие Фано |
| 2 |
Проверить неравенство Крафта — достаточно ли «места» для кодов |
| 3 |
Нарисовать кодовое дерево — свободные листья = допустимые коды |
| 4 |
При декодировании — читать слева направо, жадно |
| 5 |
Обратное условие Фано — то же, но с концами (постфиксы) |
| 6 |
Макмиллан: Крафт работает для ВСЕХ однозначных кодов, не только префиксных |
| 7 |
Ограничения на коды → рекурсия для подсчёта допустимых строк |
| 8 |
q-ичные коды: заменить 2 на q в неравенстве Крафта |
| 9 |
Единицы: средняя длина в битах на символ, объём = длина × число символов |
Проверь себя8 заданий
1 / 8