Алгоритм Краскала, Прима для нахождения минимального остовного дерева


Канонические коды Хаффмана[править | править код]


Download 285.1 Kb.
bet8/10
Sana17.06.2023
Hajmi285.1 Kb.
#1547608
TuriЗадача
1   2   3   4   5   6   7   8   9   10
Bog'liq
Алгоритм Краскала

Канонические коды Хаффмана[править | править код]


Проблема обычного алгоритма сжатия по Хаффману — недетерминированность. Для похожих последовательностей могут получиться разные деревья, так и одно дерево без правильной сериализации может соответствовать разным последовательностям. Для избежания применяют канонические коды Хаффмана.
В этом алгоритме не строится дерево Хаффмана[3].
Состоит из двух этапов:

  1. Подсчёт длины кода для какого-то символа

  2. Составление кода.


  1. Посчитаем частотность для каждого символа

  2. Отсортируем их в лексикографическом порядке.

  3. В массив запишем частотность каждой буквы.

  4. Слева приписываем массив той же длины, но с порядковыми номерами из правого массива. Левый массив получается списком указателей на элементы правой части.

  5. В левой части делаем не возрастающую пирамиду. Но heap будет не по значению элементов массива, а по значению на ссылаемый элемент массива.

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

    1. Правую половину не трогаем

    2. Первый элемент массива заменяем на самый правый элемент левого массива, якобы сдвигая границу разделения.

    3. Проверяем условия правильности пирамиды, если что-то не так, то надо повторить «хипизацию».

    4. Убирается первый элемент левой части массива и объединяется ранее убранным. Сумма их частотностей записывается в границу между левым и правым массивом.

    5. На место удалённого элемента в левой части записывается индекс массива куда добавили сумму частотностей на прошлом шаге.

    6. Из-за того объединили два элемента нужно изменить значения этих элементов массива ссылкой на родителя, куда их положили.

  7. Повторяем, в куче слева не останется 1 элемент.

  8. В правой части массива получились ссылки на элементы, объеднияющие 2 символа. Поэтому идём по массиву по ссылкам, инкрементируя уровень погружения.

  9. Количество переходов по ссылкам будет длиной кода Хаффмана.
Подсчёт длины[править | править код]

Составление кода[править | править код]


  1. Расположим элементы в лексикографическом порядке.

  2. Составим таблицу, состоящую из блоков, начиная с самой большой длины кода. Каждый блок будет содержать элементы с одинаковой длиной кода.

  3. Самый первый символ таблицы кодируется нулями.

  4. В каждом блоке символы будут находиться в лексикографическом порядке.

  5. Коды в блоке будут иметь двоичный вид и различаться на 1.

  6. При переходе в следующий блок биты кода самого последнего символа отсекаются и добавляется 1.

Download 285.1 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling