Гамма-, дельта- и омега-код Элиаса — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Коды переменной длины (Variable + Variable))
(Гамма-код Элиаса)
Строка 38: Строка 38:
  
 
=== Гамма-код Элиаса ===
 
=== Гамма-код Элиаса ===
 +
 
{{Определение
 
{{Определение
 
|id = def1
 
|id = def1
 
|definition ='''Гамма-код Элиаса ''' {{---}} это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Он обычно используется при кодировании целых чисел, максимальное значение которых не может быть определено заранее, или чтобы сжать данные, в которых маленькие значения встречаются более часто, чем большие.}}
 
|definition ='''Гамма-код Элиаса ''' {{---}} это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Он обычно используется при кодировании целых чисел, максимальное значение которых не может быть определено заранее, или чтобы сжать данные, в которых маленькие значения встречаются более часто, чем большие.}}
 +
 +
==== Алгоритм построения гамма-кода Элиаса ====
 +
 +
Способ первый:
 +
 +
1. Записать число в двоичном представлении;
 +
 +
2. Перед двоичным представлением дописать нули, количество нулей на единицу меньше количества битов двоичного представления числа.
 +
 +
Способ второй:
 +
 +
1. Выделить из целого числа старший значащий бит (самую большую степень 2, которую число включает — 2N) и младшие N бит;
 +
 +
2. Записать N в унарном коде, то есть N нулей, за которыми следует единица;
 +
 +
3. Дописать N младших двоичных цифр числа следом за этим унарным кодом.
 +
 +
==== Декодирование ====

Версия 01:11, 27 ноября 2014

Коды без памяти

Простейшими кодами, на основе которых может выполняться сжатие данных, являются коды без памяти. В коде без памяти каждый символ в кодируемом векторе данных заменяется кодовым словом из префиксного множества двоичных последовательностей или слов.

К примеру, множество двоичных слов [math]S_1[/math] = [math] \{00, 01, 100, 110, 1010, 1011\} [/math] является префиксным множеством двоичных последовательностей, поскольку, если проверить любую из 30 возможных совместных комбинаций ([math]w_i[/math], [math]w_j[/math]) из [math]S_1[/math], то видно, что [math]w_i[/math] никогда не явится префиксом (или началом) [math]w_j[/math]. С другой стороны, множество [math]S_2[/math] = [math] \{00, 001, 1110\} [/math] не является префиксным множеством двоичных последовательностей, так как последовательность 00 является префиксом (началом) другой последовательности из этого множества — 001. Соответственно, множество [math]S_1[/math] может быть множеством кодовых слов для вектора данных в коде без памяти, а [math]S_2[/math] — нет.

Разделение мантисс и экспонент

Английское название метода - Separate Exponents and Mantissas (SEM).

Цель — сжатие потока R-битовых элементов.

Основная идея состоит в том, чтобы отдельно описывать порядок значения элемента ("экспоненту" [math]E_i[/math]) и отдельно — значащие цифры значения ("мантиссу" [math]M_i[/math]).

Значащие цифры начинаются со старшей ненулевой цифры: например, в числе [math]000001101_2[/math] = [math]1\times2^0+0\times2^1+1\times2^2+1\times2^3+0\times2^4+0\times...[/math] = 13 это последние 4 цифры. Порядок числа определяется позицией старшей ненулевой цифры в записи числа. Как и при обычной записи в десятичной системе, он равен числу цифр в записи числа без предшествующих незначащих нулей. В данном примере порядок равен четырем.

Методы данной группы являются трансформирующими и поточными, то есть могут применяться даже в том случае, когда объем входных данных заранее не известен. В общем случае скорость работы компрессора (содержащего прямое, «сжимающее» преобразование) равна скорости декомпрессора (реализующего обратное, «разжимающее» преобразование) и зависит только от объема исходных данных. Памяти потребуется всего несколько байтов.

В самом простом случае под запись экспонент и мантисс отводится фиксированное число битов: Е и М. Причем [math]E \geqslant 1[/math], [math]M \geqslant 1[/math], 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 младших двоичных цифр числа следом за этим унарным кодом.

Декодирование