Метод перемещения стопки книг
Это преобразование также само по себе не сжимает данные, но его реализация в ряде случаев дает ощутимый выигрыш при использовании статистических алгоритмов, в частности, например, преобразования Хаффмана.
Преобразование также известно под названием Move To Front (MTF). Суть его легко понять, если представить себе процесс перемещения книг в стопке, из которой время от времени берут нужную книгу и кладут наверх. Таким образом, наиболее часто используемые книги оказываются ближе к верхушке стопки.
Для примера произведем преобразование над примером, полученным в предыдущей главе после метода BWT. Пусть мы имеем алфавит из пяти букв, в упорядоченном виде они расположены в следующем порядке:
(а, б, д, к, р).
Первый символ из последовательности «р» находится в списке под номером 4, это число мы и записываем в выходной блок. Затем мы изменяем список таким образом, перенося символ «р» в вершину и сдвигая все элементы, находившиеся до него:
(р, а, б, д, к)
Следующий символ «д» оказывается в списке под номером 3. И так далее.
Символ | Список | Номер |
р | А б д к р | 4 |
д | Р а б д к | 3 |
а | Д р а б к | 2 |
к | А д р б к | 4 |
р | К а д р б | 3 |
а | Р к а д б | 2 |
а | А р к д б | 0 |
а | А р к д б | 0 |
а | А р к д б | 0 |
б | А р к д б | 4 |
б | Б а р к д | 0 |
Таким образом мы получили последовательность:
4 3 2 4 3 2 0 0 0 4 0
К слову, вспомним, что результат преобразования Барроуза – Уилера, как раз и представляет собой последовательность, в которой встречаются часто повторяющиеся символы. Такое преобразование увеличивает эффективность дальнейшего применения статистического кодера. Для сравнения возьмем последовательность с повторяющимися символами:
б б б б в в в в в г г г г г а а а а а б
Попробуем закодировать ее методом Хаффмана. Вероятности всех четырех символов в данной последовательности равны 0.25. Таким образом для кодирования каждого символа нам потребуется по 2 бита. Нетрудно посчитать, что длина выходного кода будет равна:
20 * 2 = 40 бит.
Теперь проделаем то же самое со строкой, подвергнутой MTF преобразованию:
б б б б в в в в в г г г г г а а а а а б
1 0 0 0 2 0 0 0 0 3 0 0 0 0 3 0 0 0 0 3
Символ | Частота | Вероятность | Код Хаффмана |
0 | 15 | 3/4 | 0 |
3 | 3 | 3/20 | 10 |
1 | 1 | 1/20 | 110 |
2 | 1 | 1/20 | 111 |
В результате кодирования получаем последовательность:
15 * 1 + 3 * 2 + 1 * 3 + 1 * 3 = 27 бит
Таким образом наглядно показан возможный выигрыш при использовании метода MTF для преобразования сжимаемых данных, и, в частности, при использовании совместно с преобразованием Барроуза – Уиллера.
В настоящее время, в различных модификациях и сочетаниях, два алгоритма – метод Хаффмана (или арифметическое кодирование) и метод Лемпеля-Зива – составляют основу всех коммерческих алгоритмов и программ.