Гамма-, дельта- и омега-код Элиаса — различия между версиями
Анна (обсуждение | вклад) (→Алгоритм построения омега-кода Элиаса) |
Анна (обсуждение | вклад) (→Примеры) |
||
Строка 291: | Строка 291: | ||
# <tex>65536 ... 2\times10^{19728} (2^{2^{2^2}} ... 2^{2^{2^{2^2}}} - 1)</tex> {{---}} всего <tex>4</tex> группы. | # <tex>65536 ... 2\times10^{19728} (2^{2^{2^2}} ... 2^{2^{2^{2^2}}} - 1)</tex> {{---}} всего <tex>4</tex> группы. | ||
− | Здесь быстрое возрастание количества значений в группе сильно напоминает функцию Аккермана. Начиная с третьей <tex>(i = 3)</tex> группы их диапазон лежит между значениями функции <tex>A(i - 3, 4) + 3</tex> и <tex>A(i -2, 4) + 3</tex>. | + | Здесь быстрое возрастание количества значений в группе сильно напоминает [https://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%90%D0%BA%D0%BA%D0%B5%D1%80%D0%BC%D0%B0%D0%BD%D0%B0 функцию Аккермана]. Начиная с третьей <tex>(i = 3)</tex> группы их диапазон лежит между значениями функции <tex>A(i - 3, 4) + 3</tex> и <tex>A(i -2, 4) + 3</tex>. |
{| class="wikitable" style="width:10cm" border=1 | {| class="wikitable" style="width:10cm" border=1 |
Версия 17:48, 12 декабря 2014
Содержание
Коды без памяти
Простейшими кодами, на основе которых может выполняться сжатие данных, являются коды без памяти (англ. code without memory). В коде без памяти каждый символ в кодируемом векторе данных заменяется кодовым словом из префиксного множества двоичных последовательностей или слов.
Примерами кодов без памяти являются кодирование Хаффмана и кодирование Шеннона - Фано.
Коды Хаффмана и Шеннона — Фано являются оптимальными, но все же имеют ряд недостатков. Во-первых, при кодировании методами Хаффмана или Шеннона используются вероятности появления символов алфавита в тексте. То есть для построения кода нам нужно обладать этой информацией. Для того, чтобы декодер мог расшифровать файл таблицу частот, которой пользовался кодер, следует записать в сжатый файл. Следовательно, длина сжатого сообщения увеличивается на длину таблицы частот, которая должна посылаться впереди данных, что может не оправдать сжатия. Во-вторых, необходимость наличия полной частотной статистики перед началом собственно кодирования требует двух проходов по сообщению: одного для построения модели сообщения (таблицы частот и Н-дерева), другого для собственно кодирования. Коды Элиаса решают эту проблему, при их построении не используются вероятности появления символов.
Данные коды могут быть использованы для шифрования, так как по скорости построение и декодирование этих кодов сильно выигрывает у большинства остальных, что в настоящее время очень важно.
Разделение мантисс и экспонент
Английское название метода — Separate Exponents and Mantissas (SEM).
Цель — сжатие потока
-битовых элементов.Основная идея состоит в том, чтобы отдельно описывать порядок значения элемента ("экспоненту"
) и отдельно — значащие цифры значения ("мантиссу" ).Значащие цифры начинаются со старшей ненулевой цифры: например, в числе
= это последние цифры. Порядок числа определяется позицией старшей ненулевой цифры в записи числа. Как и при обычной записи в десятичной системе, он равен числу цифр в записи числа без предшествующих незначащих нулей. В данном примере порядок равен четырем.Методы данной группы являются трансформирующими и поточными, то есть могут применяться даже в том случае, когда объем входных данных заранее не известен. В общем случае скорость работы компрессора (содержащего прямое, "сжимающее" преобразование) равна скорости декомпрессора (реализующего обратное, "разжимающее" преобразование) и зависит только от объема исходных данных. Памяти потребуется всего несколько байт.
В самом простом случае под запись экспонент и мантисс отводится фиксированное число бит:
и . Причем , , , где — число битов в записи исходного числа.Этот первый из четырех вариантов метода условно обозначим
1. Fixed
Fixed (Фиксированная длина экспоненты — Фиксированная длина мантиссы), а остальные три:2. Fixed
Variable (Фиксированная длина экспоненты — Переменная длина мантиссы),3. Variable
Variable (Переменная длина экспоненты — Переменная длина мантиссы) и4. Variable
Fixed (Переменная длина экспоненты — Фиксированная длина мантиссы).Есть несколько путей еще большего увеличения степени сжатия. Например, применение хорошо исследованных схем кодирования (Элиаса, Раиса, Голомба, Фибоначчи).
Коды переменной длины (Variable + Variable)
Определение: |
Унарное представление числа | (англ. unary code) — подряд идущих единиц, заканчивающихся контрольным нулем (иногда наоборот: нулей, за которыми следует контрольная единица). Более наглядно унарные коды можно представить в виде двоичного дерева, которое устроено следующим образом: каждому ребру, ведущему из вершины к правому ребенку, соответствует единица, иначе ноль, причем левый ребенок уже не имеет детей. Например, если нужно закодировать число m, нужно m раз пройти по правым вершинам и затем остановиться на левой.
Например, унарный код нуля —
, единицы — , двойки — и т. д.Определение: |
Универсальный код (англ. universal code) — префиксный код, который преобразует положительные целые числа в двоичные слова, с дополнительным свойством: при любом истинном распределение вероятностей на целых числах, пока распределение — монотонно (то есть | для любого ), ожидаемые длины двоичных слов находятся в пределах постоянного фактора ожидаемых длин, которые оптимальный код назначил бы для этого распределения вероятностей.
Гамма-код Элиаса
Определение: |
Гамма-код Элиаса (англ. Elias gamma code) — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Он обычно используется при кодировании целых чисел, максимальное значение которых не может быть определено заранее, или чтобы сжать данные, в которых маленькие значения встречаются более часто, чем большие. |
Алгоритм построения гамма-кода Элиаса
Способ первый:
- Записать число в двоичном представлении.
- Перед двоичным представлением дописать нули, количество нулей на единицу меньше количества битов двоичного представления числа.
Способ второй:
- Выделить из целого числа старший значащий бит (самую большую степень , которую число включает — ) и младшие бит.
- Записать в унарном коде, то есть нулей, за которыми следует единица.
- Дописать младших двоичных цифр числа следом за этим унарным кодом.
Декодирование
- Считать все нули, встречающиеся до первой . Пусть — количество этих нулей.
- Принимая во внимание единицу, которая станет первым битом целого числа, со значением , считать оставшиеся цифр целого числа.
Примеры
Пример кодирования числа
- Записать число в двоичном представлении .
- Дописать перед числом три нуля .
Пример декодирования последовательности битов
- Считываем нули до первой единицы, .
- Считываем единицу и бит. Получаем = .
Приведем примеры нескольких первых гамма-кодов Элиаса:
Число | Гамма-код |
---|---|
1 | 1 |
2 | 010 |
3 | 011 |
4 | 00100 |
5 | 00101 |
6 | 00110 |
7 | 00111 |
8 | 0001000 |
Гамма-код Элиаса не подходит для кодирования нулевых значений или отрицательных чисел. Для того, чтобы закодировать ноль нужно прибавить к нему
до кодирования и отнять после декодирования. Чтобы закодировать все целые числа можно установить биекцию (соответствие), отображая целые числа из в .Дельта-код Элиаса
Определение: |
Дельта-код Элиаса (англ. Elias delta code) — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Как далее будет видно, дельта-код с некоторого числа короче гамма-кода. |
Алгоритм построения дельта-кода Элиаса
Способ первый:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Записать — нулей и одну единицу.
- С правой стороны дописать биты числа без старшей единицы.
- С правой стороны дописать биты числа без старшей единицы ( ).
Способ второй:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Закодировать с помощью гамма-кода Элиаса.
- Дописать к справа двоичное представление числа без старшей единицы.
Декодирование
- Сосчитать — количество нулей во входном потоке до первой единицы.
- Не включая единицу считать битов. Считанное число в сумме с дает .
- Далее идут — младших битов числа . Считать их и к считанному числу прибавить .
Примеры
Пример кодирования числа
- В двоичном представлении числа всего значащих бита .
- В двоичном представлении числа всего значащих бита .
- Пишем — ноль и одну единицу .
- Дописываем справа биты числа без старшей единицы .
- Дописываем с правой стороны биты числа без старшей единицы .
Пример декодирования последовательности битов
- Считаем количество нулей до первой единицы во входном потоке .
- Читаем из потока следующие бит . Это дает нам = 4.
- Читаем из потока следующие — бит . .
Приведем примеры нескольких первых дельта-кодов Элиаса:
Число | Дельта-код |
---|---|
1 | 1 |
2 | 0100 |
3 | 0101 |
4 | 01100 |
5 | 01101 |
6 | 01110 |
7 | 01111 |
8 | 00100000 |
9 | 00100001 |
Сравнение гамма- и дельта-кодов Элиаса
Диапазон | Гамма-коды | Длина кода, бит | Дельта-коды | Длина кода, бит |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1 |
2...3 | 01x | 3 | 010x | 4 |
4...7 | 001xx | 5 | 011xx | 5 |
8...15 | 0001xxx | 7 | 00100xxx | 8 |
16...31 | 00001xxxx | 9 | 00101xxxx | 9 |
32...63 | 000001xxxxx | 11 | 00110xxxxx | 10 |
64...127 | 0000001xxxxxx | 13 | 00111xxxxxx | 11 |
128...255 | 00000001xxxxxxx | 15 | 0001000xxxxxxx | 14 |
и т. д. Символами "x" тут обозначены биты мантиссы без старшей единицы.
Для диапазона
коды формируются следующим образом:Гамма-код:
раз раз ; длина бит;Дельта-код:
раз раз ; длина: бит, где — целая часть логарифма числа по основанию ; — биты, относящиеся к записи экспоненты дельта-кода, их число .Единственное отличие между гамма- и дельта-кодами состоит в том, что в гамма-кодах экспоненты записываются в унарном виде, а в дельта-кодах к ним еще раз применяется гамма-кодирование.
Можно видеть, что для чисел
дельта-код длиннее гамма-кода, для чисел длина дельта-кода совпадает с длиной гамма-кода, для всех остальных чисел дельта-код короче гамма-кода. Это происходит вследствие того, как строятся данные коды. Как показано выше, длина гама-кода , что при больших очевидно больше, чемОмега-код Элиаса
Определение: |
Омега-код Элиаса (англ. Elias omega code) — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом. Так же, как гамма- и дельта-код Элиаса, он приписывает к началу целого числа порядок его величины в универсальном коде. Однако, в отличие от двух других указанных кодов, омега-код рекурсивно кодирует префикс, именно поэтому он также известен, как рекурсивный код Элиаса. |
Омега-кодирование используется в приложениях, где самое большое кодируемое значение неизвестно заранее, или для сжатия данных, в которых маленькие значения встречаются намного чаще, чем большие.
Данные коды состоят из последовательности групп длинной
бит, которые начинаются (слева) с бита . В конце последовательности (справа) всегда . Длина каждой следующей -й группы задается значением битов предыдущей -й группы.В омега-кодах Элиаса длина первой группы —
бита. Длина следующей группы на единицу больше значения предыдущей. Первое значение задается отдельно.Алгоритм построения омега-кода Элиаса
- В конец представления записать .
- Если число не единица , слева от построенной последовательности добавить его двоичное представление.
- В записать новое значение — количество только что записанных цифр(бит), минус один.
- Вернуться к шагу 2.
Декодирование
- Записываем в переменную единицу.
- Считываем первый слева бит. Если он равен единице, то считываем группу бит длиной . Записываем в число, двоичное представление которого равно этой группе бит. Если он равен нулю, то и есть наше число.
- Удаляем считанную группу из последовательности и переходим к шагу 2.
Примеры
Пример кодирования числа
- Записываем .
- Добавляем справа от нуля двоичное представление .
- (длина последовательности минус ).
- Добавляем справа двоичное представление .
- , значит кодирует последовательность .
Пример декодирования последовательности
- .
- Считываем группу .
- Считываем группу .
- Следующий бит , поэтому закодированное число — .
Приведем примеры нескольких первых омега-кодов Элиаса:
Число | Омега-код |
---|---|
1 | 0 |
2 | 10 0 |
3 | 11 0 |
4 | 10 100 0 |
5 | 10 101 0 |
6 | 10 110 0 |
7 | 10 111 0 |
8 | 11 1000 0 |
9 | 11 1001 0 |
10 | 11 1010 0 |
11 | 11 1011 0 |
12 | 11 1100 0 |
13 | 11 1101 0 |
14 | 11 1110 0 |
15 | 11 1111 0 |
16 | 10 100 10000 0 |
Количество групп в коде возрастает быстро вначале, но далее — очень медленно:
- для будет групп;
- — группа;
- — группы;
- — группы;
- — всего группы.
Здесь быстрое возрастание количества значений в группе сильно напоминает функцию Аккермана. Начиная с третьей группы их диапазон лежит между значениями функции и .
Число | Омега-код | Длина |
---|---|---|
1 | 0 | 1 |
2—3 | 1x 0 | 3 |
4—7 | 10 1xx 0 | 6 |
8—15 | 11 1xxx 0 | 7 |
16—31 | 10 100 1xxxx 0 | 11 |
32—63 | 10 101 1xxxxx 0 | 12 |
64—127 | 10 110 1xxxxxx 0 | 13 |
128—255 | 10 111 1xxxxxxx 0 | 14 |
256—511 | 11 1000 1xxxxxxxx 0 | 16 |
511—1023 | 11 1001 1xxxxxxxxx 0 | 17 |
Источники информации
- Д. Ватолин, Ратушняк, М. Смирнов, В. Юкин "Методы сжатия данных"
- Кодирование целых чисел
- Википедия — Гамма-код Элиаса
- Википедия — Дельта-код Элиаса
- Википедия — Омега-код Элиаса
- Википедия — Универсальный код