Дельта-код Элиаса: различия между версиями
(орфография) |
w>AVB (стилевые правки, дополнение, оформление) |
||
Строка 1: | Строка 1: | ||
'''Дельта-код Элиаса ''' — это [[универсальный код]] для кодирования положительных целых чисел, разработанный Питером Элиасом. | '''Дельта-код Элиаса ''' — это [[универсальный код]] для кодирования положительных целых чисел, разработанный Питером Элиасом. | ||
− | + | Алгоритм кодирования числа N: | |
− | # | + | # Сосчитать <math>L</math> — количество значащих битов в двоичном представлении числа <math>N</math>. |
− | # Сосчитать | + | # Сосчитать <math>M</math> — количество значащих битов в двоичном представлении числа <math>L</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>). |
− | + | Иначе этот алгоритм можно описать так: | |
− | # | + | # Сосчитать <math>L</math> — количество значащих битов в двоичном представлении числа <math>N</math>. |
− | # Закодировать | + | # Закодировать <math>L</math> с помощью [[Гамма-код Элиаса|гамма-кода Элиаса]] (γ(L)). |
− | # | + | # Дописать двоичное представление числа <math>N</math> без старшей единицы. |
− | + | То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты (разрядности числа — количества значащих битов) и мантиссы (собственно значащих битов), но в гамма-коде экспонента записывается в [[Унарное кодирование|унарном виде]], а в дельта-коде к ней ещё раз применяется гамма-кодирование. | |
− | {| class="standard" style="text-align:right" | + | |
− | ! | + | Результаты кодирования первых 17 чисел: |
− | |- | + | {| class="standard" align="center" style="text-align:right" |
− | + | |-align="center" | |
+ | !colspan="2" rowspan="2"| N ||colspan="2" rowspan="2"| L ||rowspan="2"| M ||colspan="2"| Результат ||rowspan="2"| Длина,<br />бит ||rowspan="2"| Предполагаемая<br />вероятность | ||
+ | |-align="center" | ||
+ | ! γ(L) || N<sub>2</sub> | ||
|- | |- | ||
− | | 2 || 2 | + | | 1 || 1<sub>2</sub> || 1 || 1<sub>2</sub> || 1 || 1 ||align="left"| || 1 || 1/2 |
|- | |- | ||
− | | | + | | 2 || 10<sub>2</sub> || 2 || 10<sub>2</sub> || 2 || 01 0 ||align="left"| 0 || 4 || 1/16 |
|- | |- | ||
− | | | + | | 3 || 11<sub>2</sub> || 2 || 10<sub>2</sub> || 2 || 01 0 ||align="left"| 1 || 4 || 1/16 |
|- | |- | ||
− | | | + | | 4 || 100<sub>2</sub> || 3 || 11<sub>2</sub> || 2 || 01 1 ||align="left"| 00 || 5 || 1/32 |
|- | |- | ||
− | | | + | | 5 || 101<sub>2</sub> || 3 || 11<sub>2</sub> || 2 || 01 1 ||align="left"| 01 || 5 || 1/32 |
|- | |- | ||
− | | | + | | 6 || 110<sub>2</sub> || 3 || 11<sub>2</sub> || 2 || 01 1 ||align="left"| 10 || 5 || 1/32 |
|- | |- | ||
− | | | + | | 7 || 111<sub>2</sub> || 3 || 11<sub>2</sub> || 2 || 01 1 ||align="left"| 11 || 5 || 1/32 |
|- | |- | ||
− | | | + | | 8 || 1000<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 000 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 9 || 1001<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 001 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 10 || 1010<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 010 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 11 || 1011<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 011 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 12 || 1100<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 100 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 13 || 1101<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 101 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 14 || 1110<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 110 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 15 || 1111<sub>2</sub> || 4 || 100<sub>2</sub> || 3 || 001 00 ||align="left"| 111 || 8 || 1/256 |
|- | |- | ||
− | | | + | | 16 || 10000<sub>2</sub> || 5 || 101<sub>2</sub> || 3 || 001 01 ||align="left"| 0000 || 9 || 1/512 |
|- | |- | ||
− | | | + | | 17 || 10001<sub>2</sub> || 5 || 101<sub>2</sub> || 3 || 001 01 ||align="left"| 0001 || 9 || 1/512 |
|} | |} | ||
− | + | Алгоритм декодирования числа из дельта-кода Элиаса: | |
− | # | + | # Сосчитать <math>M</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>2^{L-1}</math>. |
− | Пример для 001010001: | + | Пример декодирования для <tt>001010001</tt>: |
− | # Прочитать из потока 001 и определить, что в начале 2 ведущих | + | # Прочитать из потока <tt>001</tt> и определить, что в начале 2 ведущих нуля (<math>M = 2</math>). |
− | # Прочитать из потока | + | # Прочитать из потока следующие <math>M = 2</math> бита → <tt>01</tt>; это даёт <math>L = 2^M +</math> 01<sub>2</sub> <math>= 4 + 1 = 5</math>. |
− | + | # Прочитать из потока следующие <math>L-1 = 4</math> бита → <tt>0001</tt>; это даёт <math>N = 2^{L-1}</math> + 0001<sub>2</sub> <math>= 16 + 1 = 17</math>. | |
− | # | ||
− | |||
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: [[Гамма-код Элиаса#Обобщение]]). | С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: [[Гамма-код Элиаса#Обобщение]]). | ||
Строка 71: | Строка 72: | ||
== См. также == | == См. также == | ||
* [[Омега-код Элиаса]] | * [[Омега-код Элиаса]] | ||
− | |||
[[Категория:Алгоритмы сжатия без потерь]] | [[Категория:Алгоритмы сжатия без потерь]] |
Версия от 05:09, 26 октября 2009
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Алгоритм кодирования числа N:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Записать нулей и одну единицу.
- Записать L2 — младших битов двоичного представления числа без старшей единицы ().
- Записать N2 — младших битов двоичного представления числа без старшей единицы ().
Иначе этот алгоритм можно описать так:
- Сосчитать — количество значащих битов в двоичном представлении числа .
- Закодировать с помощью гамма-кода Элиаса (γ(L)).
- Дописать двоичное представление числа без старшей единицы.
То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты (разрядности числа — количества значащих битов) и мантиссы (собственно значащих битов), но в гамма-коде экспонента записывается в унарном виде, а в дельта-коде к ней ещё раз применяется гамма-кодирование.
Результаты кодирования первых 17 чисел:
N | L | M | Результат | Длина, бит |
Предполагаемая вероятность | |||
---|---|---|---|---|---|---|---|---|
γ(L) | N2 | |||||||
1 | 12 | 1 | 12 | 1 | 1 | 1 | 1/2 | |
2 | 102 | 2 | 102 | 2 | 01 0 | 0 | 4 | 1/16 |
3 | 112 | 2 | 102 | 2 | 01 0 | 1 | 4 | 1/16 |
4 | 1002 | 3 | 112 | 2 | 01 1 | 00 | 5 | 1/32 |
5 | 1012 | 3 | 112 | 2 | 01 1 | 01 | 5 | 1/32 |
6 | 1102 | 3 | 112 | 2 | 01 1 | 10 | 5 | 1/32 |
7 | 1112 | 3 | 112 | 2 | 01 1 | 11 | 5 | 1/32 |
8 | 10002 | 4 | 1002 | 3 | 001 00 | 000 | 8 | 1/256 |
9 | 10012 | 4 | 1002 | 3 | 001 00 | 001 | 8 | 1/256 |
10 | 10102 | 4 | 1002 | 3 | 001 00 | 010 | 8 | 1/256 |
11 | 10112 | 4 | 1002 | 3 | 001 00 | 011 | 8 | 1/256 |
12 | 11002 | 4 | 1002 | 3 | 001 00 | 100 | 8 | 1/256 |
13 | 11012 | 4 | 1002 | 3 | 001 00 | 101 | 8 | 1/256 |
14 | 11102 | 4 | 1002 | 3 | 001 00 | 110 | 8 | 1/256 |
15 | 11112 | 4 | 1002 | 3 | 001 00 | 111 | 8 | 1/256 |
16 | 100002 | 5 | 1012 | 3 | 001 01 | 0000 | 9 | 1/512 |
17 | 100012 | 5 | 1012 | 3 | 001 01 | 0001 | 9 | 1/512 |
Алгоритм декодирования числа из дельта-кода Элиаса:
- Сосчитать — количество нулей во входном потоке до первой единицы.
- За единицей следуют младших битов числа . Прочитать их и добавить к результату . Если число во входном потоке записано от старших битов к младшим, то первую единицу после ведущей серии нулей можно читать как часть двоичного представления числа , в этом случае добавлять отдельным шагом нет необходимости.
- Следом идут младших битов числа . Прочитать их и добавить к результату .
Пример декодирования для 001010001:
- Прочитать из потока 001 и определить, что в начале 2 ведущих нуля ().
- Прочитать из потока следующие бита → 01; это даёт 012 .
- Прочитать из потока следующие бита → 0001; это даёт + 00012 .
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).