Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Алгоритм кодирования числа N:
- Сосчитать
— количество значащих битов в двоичном представлении числа
.
- Сосчитать
— количество значащих битов в двоичном представлении числа
.
- Записать
нулей и одну единицу.
- Дописать
—
младших битов двоичного представления числа
без старшей единицы (
).
- Дописать
—
младших битов двоичного представления числа
без старшей единицы (
).
Иначе этот алгоритм можно описать так:
- Сосчитать
— количество значащих битов в двоичном представлении числа
.
- Закодировать
с помощью гамма-кода Элиаса (γ(L)).
- Дописать двоичное представление числа
без старшей единицы.
То есть и в дельта-, и в гамма-коде Элиаса число кодируется в виде экспоненты
(разрядности числа — количества значащих битов) и мантиссы
(собственно значащих битов), но в гамма-коде экспонента записывается в унарном виде, а в дельта-коде к ней ещё раз применяется гамма-кодирование.
Пример кодирования числа 10:
- В двоичном представлении числа
4 значащих бита (
).
- В двоичном представлении числа
3 значащих бита (
).
- Записываем
нуля и одну единицу → 001
.
- Дописывем биты числа
без старшей единицы → 00
.
- Дописывем биты числа
без старшей единицы → 010
.
- Результат —
00100010
.
Результаты кодирования первых 17 чисел (для сравнения показан также гамма-код):
N |
L |
M |
Дельта-код |
Длина, бит |
Предполагаемая вероятность |
Гамма-код |
Длина, бит
|
γ(L) |
![{\displaystyle N_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/597ea9dac049261fdda77c5176b050e6588d6bb9) |
![{\displaystyle L}](https://wikimedia.org/api/rest_v1/media/math/render/svg/103168b86f781fe6e9a4a87b8ea1cebe0ad4ede8) |
|
1 |
![{\displaystyle 1_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/31ea8b03932b5ee61ba860cac7a491025e987257) |
1 |
![{\displaystyle 1_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/31ea8b03932b5ee61ba860cac7a491025e987257) |
1 |
1 |
|
1 |
1/2 |
1 |
|
1
|
2 |
![{\displaystyle 10_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/113aee51ce51cebc0fd91af88c633e1ca2e08d16) |
2 |
![{\displaystyle 10_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/113aee51ce51cebc0fd91af88c633e1ca2e08d16) |
2 |
01 0 |
0 |
4 |
1/16 |
01 |
0 |
3
|
3 |
![{\displaystyle 11_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3eb449dd4dccb527460155958adf26c20f9f939) |
2 |
![{\displaystyle 10_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/113aee51ce51cebc0fd91af88c633e1ca2e08d16) |
2 |
01 0 |
1 |
4 |
1/16 |
01 |
1 |
3
|
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
![{\displaystyle 11_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3eb449dd4dccb527460155958adf26c20f9f939) |
2 |
01 1 |
00 |
5 |
1/32 |
001 |
00 |
5
|
5 |
![{\displaystyle 101_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/265d75b35b344ee4fd701b0e9cacf30c58d1df1f) |
3 |
![{\displaystyle 11_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3eb449dd4dccb527460155958adf26c20f9f939) |
2 |
01 1 |
01 |
5 |
1/32 |
001 |
01 |
5
|
6 |
![{\displaystyle 110_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/29c145af3527d77bf347b4d652333599764b1ff7) |
3 |
![{\displaystyle 11_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3eb449dd4dccb527460155958adf26c20f9f939) |
2 |
01 1 |
10 |
5 |
1/32 |
001 |
10 |
5
|
7 |
![{\displaystyle 111_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/725d0e907c8717e2ffdc31ac04d63a058564490c) |
3 |
![{\displaystyle 11_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/b3eb449dd4dccb527460155958adf26c20f9f939) |
2 |
01 1 |
11 |
5 |
1/32 |
001 |
11 |
5
|
8 |
![{\displaystyle 1000_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/47bf7eed4e162d3d5ec8a3d822e1f9a81e7c983a) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
000 |
8 |
1/256 |
0001 |
000 |
7
|
9 |
![{\displaystyle 1001_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/4dd5c90420bffc6f297028d06ac201b7ff2ae8d1) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
001 |
8 |
1/256 |
0001 |
001 |
7
|
10 |
![{\displaystyle 1010_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ca0a08d507cf23ad20dd091fedfdd4675024f39e) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
010 |
8 |
1/256 |
0001 |
010 |
7
|
11 |
![{\displaystyle 1011_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a6ce5afd8ce595fed5314d5ba653ed06a47d0fe8) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
011 |
8 |
1/256 |
0001 |
011 |
7
|
12 |
![{\displaystyle 1100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/981f5aba2e0ece37fa2fb4e03ca3ae5f64898f9b) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
100 |
8 |
1/256 |
0001 |
100 |
7
|
13 |
![{\displaystyle 1101_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9083afc43a1743c74e82601887d2c22fc4a76e25) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
101 |
8 |
1/256 |
0001 |
101 |
7
|
14 |
![{\displaystyle 1110_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/087b2ed83213f1cfb3582ef8c3268975aafabb94) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
110 |
8 |
1/256 |
0001 |
110 |
7
|
15 |
![{\displaystyle 1111_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/247bcfadb663bdbcdfd10abf0946919158e6cc8f) |
4 |
![{\displaystyle 100_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/733b5c3ac3e96d091831e49fe297bfb555c5f496) |
3 |
001 00 |
111 |
8 |
1/256 |
0001 |
111 |
7
|
16 |
![{\displaystyle 10000_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8d263db871bd6e34734bd906a813056b047da3fc) |
5 |
![{\displaystyle 101_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/265d75b35b344ee4fd701b0e9cacf30c58d1df1f) |
3 |
001 01 |
0000 |
9 |
1/512 |
00001 |
0000 |
9
|
17 |
![{\displaystyle 10001_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/95776ea8ef1e19775f8aa2601f6d2566d4c39d5f) |
5 |
![{\displaystyle 101_{2}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/265d75b35b344ee4fd701b0e9cacf30c58d1df1f) |
3 |
001 01 |
0001 |
9 |
1/512 |
00001 |
0001 |
9
|
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).
Алгоритм декодирования числа из дельта-кода Элиаса:
- Сосчитать
— количество нулей во входном потоке до первой единицы.
- За единицей следуют
младших битов числа
, прочитать их и добавить к результату значение
. Если биты
во входном потоке записаны от старших к младшим, то первую единицу после ведущей серии нулей можно читать как часть двоичного представления числа
, в этом случае добавлять
отдельным шагом нет необходимости.
- Следом идут
младших битов числа
, прочитать их и добавить к результату значение
.
Пример декодирования последовательности битов 001010001:
- Прочитать из потока 001 и определить, что в начале 2 ведущих нуля (
).
- Прочитать из потока следующие
бита → 01; это даёт
.
- Прочитать из потока следующие
бита → 0001; это даёт
.
Для чисел 2, 3, 8…15 дельта-код длиннее гамма-кода, для чисел 1, 4…7, 16…31 длина дельта-кода совпадает с длиной гамма-кода, для всех остальных чисел дельта-код короче гамма-кода. Соответственно, дельта-код тем менее выгоднее гамма-кода, чем неравномернее распределение вероятностей кодируемых чисел и чем более вероятны их значения при приближении к нулю.