Дельта-код Элиаса: различия между версиями
w>AVB (оформление, дополнение) |
w>AVB (стилевые правки, дополнение) |
||
Строка 6: | Строка 6: | ||
# Сосчитать <math>M</math> — количество значащих битов в двоичном представлении числа <math>L</math>. | # Сосчитать <math>M</math> — количество значащих битов в двоичном представлении числа <math>L</math>. | ||
# Записать <math>M - 1</math> нулей и одну единицу. | # Записать <math>M - 1</math> нулей и одну единицу. | ||
− | # | + | # Дописать L<sub>2</sub> — <math>M - 1</math> младших битов двоичного представления числа <math>L</math> без старшей единицы (<math>2^{M-1}</math>). |
− | # | + | # Дописать N<sub>2</sub> — <math>L - 1</math> младших битов двоичного представления числа <math>N</math> без старшей единицы (<math>2^{L-1}</math>). |
Иначе этот алгоритм можно описать так: | Иначе этот алгоритм можно описать так: | ||
Строка 16: | Строка 16: | ||
То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты L (разрядности числа — количества значащих битов) и мантиссы N<sub>2</sub> (собственно значащих битов), но в гамма-коде экспонента записывается в [[Унарное кодирование|унарном виде]], а в дельта-коде к ней ещё раз применяется гамма-кодирование. | То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты L (разрядности числа — количества значащих битов) и мантиссы N<sub>2</sub> (собственно значащих битов), но в гамма-коде экспонента записывается в [[Унарное кодирование|унарном виде]], а в дельта-коде к ней ещё раз применяется гамма-кодирование. | ||
− | Результаты кодирования первых 17 чисел (для сравнения показан | + | Пример кодирования числа 10: |
+ | |||
+ | # В двоичном представлении числа <math>N = 10</math> (1010<sub>2</sub>) 4 значащих бита (<math>L = 4</math>). | ||
+ | # В двоичном представлении числа <math>L = 4</math> (100<sub>2</sub>) 3 значащих бита (<math>M = 3</math>). | ||
+ | # Записываем <math>M-1 = 2</math> нуля и одну единицу → <code>001</code>. | ||
+ | # Дописывем биты числа <math>L</math> без старшей единицы → <code>00</code>. | ||
+ | # Дописывем биты числа <math>N</math> без старшей единицы → <code>010</code>. | ||
+ | # Результат — <code>00100010</code>. | ||
+ | |||
+ | Результаты кодирования первых 17 чисел (для сравнения показан также гамма-код): | ||
{| class="standard" align="center" style="text-align:right" | {| class="standard" align="center" style="text-align:right" | ||
Строка 64: | Строка 73: | ||
Алгоритм декодирования числа из дельта-кода Элиаса: | Алгоритм декодирования числа из дельта-кода Элиаса: | ||
# Сосчитать <math>M</math> — количество нулей во входном потоке до первой единицы. | # Сосчитать <math>M</math> — количество нулей во входном потоке до первой единицы. | ||
− | # За единицей следуют <math>M</math> младших битов числа <math>L</math> | + | # За единицей следуют <math>M</math> младших битов числа <math>L</math>, прочитать их и добавить к результату значение <math>2^M</math>. Если биты <math>L</math> во входном потоке записаны от старших к младшим, то первую единицу после ведущей серии нулей можно читать как часть двоичного представления числа <math>L</math>, в этом случае добавлять <math>2^M</math> отдельным шагом нет необходимости. |
− | # Следом идут <math>L - 1</math> младших битов числа <math>N</math> | + | # Следом идут <math>L - 1</math> младших битов числа <math>N</math>, прочитать их и добавить к результату значение <math>2^{L-1}</math>. |
− | Пример декодирования | + | Пример декодирования последовательности битов <tt>001010001</tt>: |
# Прочитать из потока <tt>001</tt> и определить, что в начале 2 ведущих нуля (<math>M = 2</math>). | # Прочитать из потока <tt>001</tt> и определить, что в начале 2 ведущих нуля (<math>M = 2</math>). |
Версия от 07:03, 27 октября 2009
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Кодирование
Алгоритм кодирования числа N:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Записать нулей и одну единицу.
- Дописать L2 — младших битов двоичного представления числа без старшей единицы ().
- Дописать N2 — младших битов двоичного представления числа без старшей единицы ().
Иначе этот алгоритм можно описать так:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Закодировать с помощью гамма-кода Элиаса (γ(L)).
- Дописать двоичное представление числа без старшей единицы.
То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты L (разрядности числа — количества значащих битов) и мантиссы N2 (собственно значащих битов), но в гамма-коде экспонента записывается в унарном виде, а в дельта-коде к ней ещё раз применяется гамма-кодирование.
Пример кодирования числа 10:
- В двоичном представлении числа (10102) 4 значащих бита ().
- В двоичном представлении числа (1002) 3 значащих бита ().
- Записываем нуля и одну единицу →
001
. - Дописывем биты числа без старшей единицы →
00
. - Дописывем биты числа без старшей единицы →
010
. - Результат —
00100010
.
Результаты кодирования первых 17 чисел (для сравнения показан также гамма-код):
N | L | M | Дельта-код | Длина, бит |
Предполагаемая вероятность |
Гамма-код | Длина, бит | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
γ(L) | N2 | L | N2 | ||||||||
1 | 12 | 1 | 12 | 1 | 1 | 1 | 1/2 | 1 | 1 | ||
2 | 102 | 2 | 102 | 2 | 01 0 | 0 | 4 | 1/16 | 01 | 0 | 3 |
3 | 112 | 2 | 102 | 2 | 01 0 | 1 | 4 | 1/16 | 01 | 1 | 3 |
4 | 1002 | 3 | 112 | 2 | 01 1 | 00 | 5 | 1/32 | 001 | 00 | 5 |
5 | 1012 | 3 | 112 | 2 | 01 1 | 01 | 5 | 1/32 | 001 | 01 | 5 |
6 | 1102 | 3 | 112 | 2 | 01 1 | 10 | 5 | 1/32 | 001 | 10 | 5 |
7 | 1112 | 3 | 112 | 2 | 01 1 | 11 | 5 | 1/32 | 001 | 11 | 5 |
8 | 10002 | 4 | 1002 | 3 | 001 00 | 000 | 8 | 1/256 | 0001 | 000 | 7 |
9 | 10012 | 4 | 1002 | 3 | 001 00 | 001 | 8 | 1/256 | 0001 | 001 | 7 |
10 | 10102 | 4 | 1002 | 3 | 001 00 | 010 | 8 | 1/256 | 0001 | 010 | 7 |
11 | 10112 | 4 | 1002 | 3 | 001 00 | 011 | 8 | 1/256 | 0001 | 011 | 7 |
12 | 11002 | 4 | 1002 | 3 | 001 00 | 100 | 8 | 1/256 | 0001 | 100 | 7 |
13 | 11012 | 4 | 1002 | 3 | 001 00 | 101 | 8 | 1/256 | 0001 | 101 | 7 |
14 | 11102 | 4 | 1002 | 3 | 001 00 | 110 | 8 | 1/256 | 0001 | 110 | 7 |
15 | 11112 | 4 | 1002 | 3 | 001 00 | 111 | 8 | 1/256 | 0001 | 111 | 7 |
16 | 100002 | 5 | 1012 | 3 | 001 01 | 0000 | 9 | 1/512 | 00001 | 0000 | 9 |
17 | 100012 | 5 | 1012 | 3 | 001 01 | 0001 | 9 | 1/512 | 00001 | 0001 | 9 |
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).
Декодирование
Алгоритм декодирования числа из дельта-кода Элиаса:
- Сосчитать — количество нулей во входном потоке до первой единицы.
- За единицей следуют младших битов числа , прочитать их и добавить к результату значение . Если биты во входном потоке записаны от старших к младшим, то первую единицу после ведущей серии нулей можно читать как часть двоичного представления числа , в этом случае добавлять отдельным шагом нет необходимости.
- Следом идут младших битов числа , прочитать их и добавить к результату значение .
Пример декодирования последовательности битов 001010001:
- Прочитать из потока 001 и определить, что в начале 2 ведущих нуля ().
- Прочитать из потока следующие бита → 01; это даёт 012 .
- Прочитать из потока следующие бита → 0001; это даёт + 00012 .
Эффективность
Можно видеть, что для чисел 2, 3, 8…15 дельта-код длиннее гамма-кода, для чисел 1, 4…7, 16…31 длина дельта-кода совпадает с длиной гамма-кода, для всех остальных чисел дельта-код короче гамма-кода. Соответственно, дельта-код тем менее выгоднее гамма-кода, чем неравномернее распределение вероятностей кодируемых чисел и чем более вероятны их значения при приближении к нулю.
См. также
Литература
- Д. Ватолин, А. Ратушняк, М. Смирнов, В. Юкин. Раздел 1. Методы сжатия без потерь. Глава 1. Кодирование источников данных без памяти. Разделение мантисс и экспонент // Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео. — М.: Диалог-МИФИ, 2002. — С. 23—24. — 384 с. — ISBN 5-86404-170-x.