Дельта-код Элиаса: различия между версиями
Перейти к навигации
Перейти к поиску
w>AVB (стилевые правки) |
(орфография) |
||
Строка 17: | Строка 17: | ||
! Число || Значение || N' || N || Кодирование || Предполагаемая<br />вероятность | ! Число || Значение || N' || N || Кодирование || Предполагаемая<br />вероятность | ||
|- | |- | ||
− | | 1 || | + | | 1 || 2^0 || 0 || 1 || 1 || 1/2 |
|- | |- | ||
− | | 2 || | + | | 2 || 2^1 + 0 || 1 || 2 || 01 0 0 || 1/16 |
|- | |- | ||
− | | 3 || | + | | 3 || 2^1 + 1 || 1 || 2 || 01 0 1 || 1/16 |
|- | |- | ||
| 4 || 2² + 0 || 2 || 3 || 01 1 00 || 1/32 | | 4 || 2² + 0 || 2 || 3 || 01 1 00 || 1/32 | ||
Строка 47: | Строка 47: | ||
|15 || 2³ + 7 || 3 || 4 || 001 00 111 || 1/256 | |15 || 2³ + 7 || 3 || 4 || 001 00 111 || 1/256 | ||
|- | |- | ||
− | |16 || | + | |16 || 2^4 + 0 || 4 || 5 || 001 01 0000 || 1/512 |
|- | |- | ||
− | |17 || | + | |17 || 2^4 + 1 || 4 || 5 || 001 01 0001 || 1/512 |
|- | |- | ||
|… || || || || || | |… || || || || || |
Версия от 09:08, 25 октября 2009
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Для того, чтобы закодировать число N:
- Записать N в двоичном виде.
- Сосчитать значащие биты в N и записать их количество в двоичном виде (Х)
- В двоичном представлении N, полученном на шаге 1, удалить старший бит и запомнить результат (Y).
- К X присоединить Y.
- Добавить в начало число нулей, на единицу меньшее количества значащих бит в двоичном представлении X.
Аналогичным образом этот процесс можно описать так:
- Разделить целое число на самую большую степень 2, которую оно содержит (2N'), и оставшиеся N' двоичных цифр целого числа.
- Закодировать N = N' + 1 с помощью гамма-кода Элиаса.
- Добавить оставшиеся N' двоичных цифр к представлению N.
Начало кодирования:
Число | Значение | N' | N | Кодирование | Предполагаемая вероятность |
---|---|---|---|---|---|
1 | 2^0 | 0 | 1 | 1 | 1/2 |
2 | 2^1 + 0 | 1 | 2 | 01 0 0 | 1/16 |
3 | 2^1 + 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 | 2^4 + 0 | 4 | 5 | 001 01 0000 | 1/512 |
17 | 2^4 + 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.
С помощью дополнительной обработки исходных значений дельта-код можно использовать также для кодирования нулевых и отрицательных целых чисел (см.: Гамма-код Элиаса#Обобщение).