Лабораторная работа № 3 Построение кода переменной длины. Цель работы: Изучить метод построения кода переменной длины, оценить эффективность полученного кода и сравнить ее с эффективностью кода постоянной длины. Теоретическая часть Коды переменной длины – более экономны, но труднее в обработке по сравнению с кодами постоянной длины. Главная проблема кодов переменной длины: как копределить длину кодового слова. В коде Морзе используется специальный разделитель – пауза – для разделения отдельных кодовых слов. Каждое кодовое слово состоит из сигналов короткой передачи (точка) и длинной передачи (тире). Наличие специального разделителя снижает эффективность кода. Код называется префиксным, если кодовое слово ни одного знака не является началом (префиксом) кодового слова другого знака (условие Фано). Слова префиксного кода можно записывать в одну цепочку, не используя разделительных символов. Любую такую цепочку можно единственным образом разделить на ее компоненты. Префиксный код называется полным, если добавление к нему любого нового кодового слова нарушает свойство префиксности. Естественно, что полные коды представляют наибольший интерес, так как при прочих равных условиях они более компактны, чем неполные. Пусть, например, буквам A, B и C поставлены в соответствие кодовые слова 00, 01 и 1. Рассмотрим произвольную последовательность нулей и единиц. Ее можно разделить на кодовые слова единственным образом, а именно: 00101011001101 → 00 1 01 01 1 00 1 1 01 → A C B B C A C C B Построение полного префиксного кода для заданного сообщения можно свести к построению двоичного (бинарного) дерева. Пример построения двоичного дерева полного префиксного кода Исходное сообщение: МАМА_МЫЛА_РАМУ Алфавит А = { " ", А, Л, М, Р, У, Ы } Таблица частот появления символов в сообщении: Символ Частота А 4 М 4 "" 2 Л 1 Р 1 У 1 Ы 1 Итого 14 Построение двоичного дерева начинается с нижней части таблицы. Складываются наименьшие частоты появления символов, начиная с нижней части дерева. Например, на шаге 1 для букв Ы и У, имеющих частоту 1, составляется суммарная частота 2. Аналогично, сумма 2 составляется для букв Л и Р. Таким образом, частота 2 получится в трех узлах: у пробела (исходная частота) и двух пар букв (накопленная частота). Продолжаем строить дерево, т.е. складывать наименьшие частоты, с самых нижних узлов, а именно – с двух пар букв (шаг 2).На шаге 3 минимальными накопленными частотами являются 2 (у пробела) и 4 (у четырех букв вместе). → Шаг 1 → Шаг 2 Шаг 3 Процесс проделжается до тех пор, пока в сумме не будет получено полное число символов в сообщении (шаги 4–5), причем сначала складываются 4+4=8, а не 4+6=10. → Шаг 4 Шаг 5 В результате получим иерархический граф, называемый двоичным (бинарным) деревом – из каждой вершины графи исходят строго две дочерние ветви, а входит одна родительская ветвь (кроме вершины дерева – узла с максимальной суммой). Для того, чтобы превратить полученное дерево в двоичный префиксный код, необходимо расставить нули и единицы на ветвях полученного дерева. Принято кодировать более частые комбинации меньшими по абсолютной величине кодами. Начиная с вершины дерева (в примере – узел с суммой 14), для каждой восходящей ветви записываем 0, а для каждой нисходящей ветви 1. Символ Код Длина кодового слова А 00 2 М 01 2 "" 10 2 Л 1100 4 Р 1101 4 У 1110 4 Ы 1111 4 Таким образом, часто встречающиеся символы (А, М, " ") имеют более короткие коды, а редко встречающиеся символы (Л, Р, У, Ы) – более длинные, что дает выигрыш в средней длине кодового слова и эффективности полученного кода переменной длины. Пример расчета эффективности кода переменной длины Исходное сообщение: МАМА_МЫЛА_РАМУ Порядок выполнения лабораторной работы 1. Выписать исходное сообщение и определить его длину. 2. Составить алфавит сообщения и рассчитать частоту появления отдельных символов в сообщении. 3. Построить двоичное дерево накопленных частот встречаемости символов. 4. Составить таблицу кодирования исходного алфавита префиксным кодом переменной длины. 5. Закодировать исходное сообщение полученным префиксным кодом. 6. Рассчитать эффективность полученного кода переменной длины для заданного сообщения. 7. Сравнить полученный результат с кодом постоянной длины для того же исходного сообщения. Варианты заданий 1. БАРАН КАРАБКАЛСЯ С КАРАБИНОМ 2. ТАРАКАН ПОПАЛ В КАПКАН 3. БАРАБАНЩИК БИЛ В ЯЩИК 4. КОЛОКОЛ ИЗ ВОЛОКОЛАМСКА 5. ПОЛОТЕНЦЕ ПОПАЛО В БОЛОТО 6. КОЛОБОК ПОЛОТЕНЦЕ УВОЛОК 7. ХЕРЕС ПОПАЛ НА ПЕРЕВЯЗЬ 8. МЕЛ ЕМЕЛЯ МЕЛ В МЕЛЬНИЦЕ 9. НА ЛАПУ УПАЛА КАПЛЯ ПАКЛИ 10. НЕ ПЕЙ ПЕНУ У РЕПЕЙНИКА 11. КОЛЕСИЛ СОКОЛ ОКОЛО ОКОЛИЦЫ 12. КАК ЛОМ САМ ПОЛОМАЛСЯ ПОПОЛАМ Содержание отчета о лабораторной работе: • номер группы, ФИО, дата выполнения работы; • исходное сообщение и алфавит; • двоичное дерево построения префиксного кода; • закодированное сообщение и его длина; • количество информации в сообщении; • эффективность кода; • сравнение эффективности кодов постоянной и переменной длины.