Дельта-код Элиаса
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Алгоритм кодирования числа 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 .
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).