Гамма-, дельта- и омега-код Элиаса
Содержание
Коды без памяти
Простейшими кодами, на основе которых может выполняться сжатие данных, являются коды без памяти. В коде без памяти каждый символ в кодируемом векторе данных заменяется кодовым словом из префиксного множества двоичных последовательностей или слов.
К примеру, множество двоичных слов
= является префиксным множеством двоичных последовательностей, поскольку, если проверить любую из 30 возможных совместных комбинаций ( , ) из , то видно, что никогда не явится префиксом (или началом) . С другой стороны, множество = не является префиксным множеством двоичных последовательностей, так как последовательность 00 является префиксом (началом) другой последовательности из этого множества — 001. Соответственно, множество может быть множеством кодовых слов для вектора данных в коде без памяти, а — нет.Разделение мантисс и экспонент
Английское название метода - Separate Exponents and Mantissas (SEM).
Цель — сжатие потока R-битовых элементов.
Основная идея состоит в том, чтобы отдельно описывать порядок значения элемента ("экспоненту"
) и отдельно — значащие цифры значения ("мантиссу" ).Значащие цифры начинаются со старшей ненулевой цифры: например, в числе
= = 13 это последние 4 цифры. Порядок числа определяется позицией старшей ненулевой цифры в записи числа. Как и при обычной записи в десятичной системе, он равен числу цифр в записи числа без предшествующих незначащих нулей. В данном примере порядок равен четырем.Методы данной группы являются трансформирующими и поточными, то есть могут применяться даже в том случае, когда объем входных данных заранее не известен. В общем случае скорость работы компрессора (содержащего прямое, «сжимающее» преобразование) равна скорости декомпрессора (реализующего обратное, «разжимающее» преобразование) и зависит только от объема исходных данных. Памяти потребуется всего несколько байтов.
В самом простом случае под запись экспонент и мантисс отводится фиксированное число битов: Е и М. Причем
, , E + M = R, где R — число битов в записи исходного числа.Этот первый из четырех вариантов метода условно обозначим
1. Fixed + Fixed (Фиксированная длина экспоненты — Фиксированная длина мантиссы), а остальные три:
2. Fixed + Variable (Фиксированная длина экспоненты — Переменная длина мантиссы),
3. Variable + Variable (Переменная длина экспоненты — Переменная длина мантиссы) и
4. Variable + Fixed (Переменная длина экспоненты — Фиксированная длина мантиссы).
Есть несколько путей еще большего увеличения степени сжатия. Например, применение хорошо исследованных схем кодирования (Элиаса, Раиса, Голомба, Фибоначчи).
Коды переменной длины (Variable + Variable)
Определение: |
Унарное представление числа n — n подряд идущих единиц, заканчивающихся контрольным нулем (иногда наоборот: n нулей, за которыми следует контрольная единица). Более наглядно унарные коды можно представить в виде двоичного дерева, которое устроено следующим образом: каждому ребру, ведущему из вершины к правому ребенку, соответствует единица, иначе ноль, причем левый ребенок уже не имеет детей. Например, если нужно закодировать число m, нужно m раз пройти по правым вершинам и затем остановиться на левой. |
Например, унарный код нуля — 0, единицы — 10, двойки — 110 и т. д.
Гамма-код Элиаса
Определение: |
Гамма-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Он обычно используется при кодировании целых чисел, максимальное значение которых не может быть определено заранее, или чтобы сжать данные, в которых маленькие значения встречаются более часто, чем большие. |
Алгоритм построения гамма-кода Элиаса
Способ первый:
1. Записать число в двоичном представлении;
2. Перед двоичным представлением дописать нули, количество нулей на единицу меньше количества битов двоичного представления числа.
Способ второй:
1. Выделить из целого числа старший значащий бит (самую большую степень 2, которую число включает — 2N) и младшие N бит;
2. Записать N в унарном коде, то есть N нулей, за которыми следует единица;
3. Дописать N младших двоичных цифр числа следом за этим унарным кодом.
Декодирование
1. Считать все нули, встречающиеся до первой 1. Пусть N — количество этих нулей;
2. Принимая во внимание единицу, которая станет первым битом целого числа, со значением 2^N, считать оставшиеся N цифр целого числа.
Примеры
Пример кодирования числа 15
1. Записать число 15 в двоичном представлении -->
;2. Дописать перед числом три нуля --> 0001111.
Пример декодирования последовательности битов 000010001
1. Считываем нули до первой единицы, N = 4;
2. Считываем единицу и N = 4 бит. Получаем
+ = 17.Приведем примеры нескольких первых гамма-кодов Элиаса:
1 | |
010 | |
011 | |
00100 | |
00101 | |
00110 | |
00111 | |
0001000 |
Гамма-код Элиаса не подходит для кодирования нулевых значений или отрицательных чисел. Для того, чтобы закодировать ноль нужно прибавить к нему 1 до кодирования и отнять после декодирования. Чтобы закодировать все целые числа можно установить биекцию (соответствие), отображая целые числа из (0, 1, −1, 2, −2, 3, −3, …) в (1, 2, 3, 4, 5, 6, 7, …).