Дельта-код Элиаса: различия между версиями
Перейти к навигации
Перейти к поиску
w>AVB (оформление списка таблицей) |
w>AVB (стилевые правки) |
||
Строка 61: | Строка 61: | ||
Пример для 001010001: | Пример для 001010001: | ||
− | # | + | # Прочитать из потока 001 и определить, что в начале 2 ведущих ноля. |
− | # | + | # Прочитать из потока ещё 2 бита; вместе с результатом первого шага получится код 00101. |
− | # | + | # Декодировать 00101, результат — 5. |
− | # | + | # N' = 5-1 = 4 — число бит, которые осталось прочитать. Прочитать 4 бита; результат — 0001=1. |
− | # Закодированное число | + | # Закодированное число равно 2<sup>4</sup> + 1 = 17. |
− | + | С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: [[Гамма-код Элиаса#Обобщение]]). | |
== См. также == | == См. также == |
Версия от 23:51, 21 мая 2009
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Для того, чтобы закодировать число N:
- Записать N в двоичном виде.
- Сосчитать значащие биты в N и записать их количество в двоичном виде (Х)
- В двоичном представлении N, полученном на шаге 1, удалить старший бит и запомнить результат (Y).
- К X присоединить Y.
- Добавить в начало число нулей, на единицу меньшее количества значащих бит в двоичном представлении X.
Аналогичным образом этот процесс можно описать так:
- Разделить целое число на самую большую степень 2, которую оно содержит (2N'), и оставшиеся N' двоичных цифр целого числа.
- Закодировать N = N' + 1 с помощью гамма-кода Элиаса.
- Добавить оставшиеся N' двоичных цифр к представлению N.
Начало кодирования:
Число | Значение | N' | N | Кодирование | Предполагаемая вероятность |
---|---|---|---|---|---|
1 | 20 | 0 | 1 | 1 | 1/2 |
2 | 21 + 0 | 1 | 2 | 01 0 0 | 1/16 |
3 | 21 + 1 | 1 | 2 | 01 0 1 | 1/16 |
4 | 2² + 0 | 2 | 3 | 01 1 00 | 1/32 |
5 | 2² + 1 | 2 | 3 | 01 1 01 | 1/32 |
6 | 2² + 2 | 2 | 3 | 01 1 10 | 1/32 |
7 | 2² + 3 | 2 | 3 | 01 1 11 | 1/32 |
8 | 2³ + 0 | 3 | 4 | 001 00 000 | 1/256 |
9 | 2³ + 1 | 3 | 4 | 001 00 001 | 1/256 |
10 | 2³ + 2 | 3 | 4 | 001 00 010 | 1/256 |
11 | 2³ + 3 | 3 | 4 | 001 00 011 | 1/256 |
12 | 2³ + 4 | 3 | 4 | 001 00 100 | 1/256 |
13 | 2³ + 5 | 3 | 4 | 001 00 101 | 1/256 |
14 | 2³ + 6 | 3 | 4 | 001 00 110 | 1/256 |
15 | 2³ + 7 | 3 | 4 | 001 00 111 | 1/256 |
16 | 24 + 0 | 4 | 5 | 001 01 0000 | 1/512 |
17 | 24 + 1 | 4 | 5 | 001 01 0001 | 1/512 |
… |
Чтобы декодировать число из дельта-кода Элиаса:
- Прочитать и сосчитать количество нулей из потока, пока не встретится 1. Пусть L — количество нулей.
- Учитывая, что единица, которая была достигнута — это первая цифра целого числа, значение которого 2L, прочитать оставшиеся L цифр этого целого числа. Пусть N — прочитанное число.
- Поместить единицу на первое место конечного вывода, который представляет собой значение 2N-1. Прочитать и добавить следующие N-1 цифр.
Пример для 001010001:
- Прочитать из потока 001 и определить, что в начале 2 ведущих ноля.
- Прочитать из потока ещё 2 бита; вместе с результатом первого шага получится код 00101.
- Декодировать 00101, результат — 5.
- N' = 5-1 = 4 — число бит, которые осталось прочитать. Прочитать 4 бита; результат — 0001=1.
- Закодированное число равно 24 + 1 = 17.
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).