Дельта-код Элиаса: различия между версиями
Перейти к навигации
Перейти к поиску
Строка 42: | Строка 42: | ||
Пример: | Пример: | ||
− | 001010001 | + | |
− | # 2 ведущих ноля | + | 001010001 |
− | # | + | # Читаем из потока 001 и определяем, что в начале кода 2 ведущих ноля. |
− | # | + | # Читаем из потока еще 2 бита, то есть вместе с результатом первого шага получаем код 00101. |
− | # получится N' = 5 — 1 = 4 оставшихся бита для полного кода, то есть '0001'. | + | # Декодируем 00101 = 5. |
− | # | + | # получится N' = 5 — 1 = 4 оставшихся бита для полного кода, то есть '0001'=1. |
+ | # Закодированное число = 2<sup>4</sup> + 1 = 17. | ||
Этот код может быть также применён к целым числам с нулевым или отрицательным значением (см.: [[гамма-код Элиаса]]). | Этот код может быть также применён к целым числам с нулевым или отрицательным значением (см.: [[гамма-код Элиаса]]). |
Версия от 12:30, 21 мая 2009
Дельта-код Элиаса — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.
Для того, чтобы закодировать число N:
- Записать N в двоичном виде.
- Сосчитать значащие биты в N и записать их количество в двоичном виде (Х)
- В двоичном представлении N, полученном на шаге 1, удалить старший бит и запомнить результат (Y).
- К X присоединить Y.
- Добавить в начало число нулей, на единицу меньшее количества значащих бит в двоичном представлении X.
Аналогичным образом этот процесс можно описать так:
- Разделить целое число на самую большую степень 2, которую оно содержит (2N'), и оставшиеся N' двоичных цифр целого числа.
- Закодировать N = N' + 1 с помощью гамма-кода Элиаса.
- Добавить оставшиеся N' двоичных цифр к представлению N.
Начало кодирования:
Предполагаемые вероятности
1 = 20 => N' = 0, N = 1 => 1 1/2
2 = 21 + 0 => N' = 1, N = 2 => 0100 1/16
3 = 21 + 1 => N' = 1, N = 2 => 0101 "
4 = 2² + 0 => N' = 2, N = 3 => 01100 1/32
5 = 2² + 1 => N' = 2, N = 3 => 01101 "
6 = 2² + 2 => N' = 2, N = 3 => 01110 "
7 = 2² + 3 => N' = 2, N = 3 => 01111 "
8 = 2³ + 0 => N' = 3, N = 4 => 00100000 1/256
9 = 2³ + 1 => N' = 3, N = 4 => 00100001 "
10 = 2³ + 2 => N' = 3, N = 4 => 00100010 "
11 = 2³ + 3 => N' = 3, N = 4 => 00100011 "
12 = 2³ + 4 => N' = 3, N = 4 => 00100100 "
13 = 2³ + 5 => N' = 3, N = 4 => 00100101 "
14 = 2³ + 6 => N' = 3, N = 4 => 00100110 "
15 = 2³ + 7 => N' = 3, N = 4 => 00100111 "
16 = 24 + 0 => N' = 4, N = 5 => 001010000 1/512
17 = 24 + 1 => N' = 4, N = 5 => 001010001 "
…
Чтобы декодировать число из Дельта-кода Элиаса:
- Прочитать и сосчитать количество нулей из потока, пока не встретится 1. Пусть L — количество нулей.
- Учитывая, что единица, которая была достигнута — это первая цифра целого числа, значение которого 2L, прочитать оставшиеся L цифр этого целого числа. Пусть N — прочитанное число.
- Поместить единицу на первое место конечного вывода, который представляет собой значение 2N-1. Прочитать и добавить следующие N-1 цифр.
Пример:
001010001
- Читаем из потока 001 и определяем, что в начале кода 2 ведущих ноля.
- Читаем из потока еще 2 бита, то есть вместе с результатом первого шага получаем код 00101.
- Декодируем 00101 = 5.
- получится N' = 5 — 1 = 4 оставшихся бита для полного кода, то есть '0001'=1.
- Закодированное число = 24 + 1 = 17.
Этот код может быть также применён к целым числам с нулевым или отрицательным значением (см.: гамма-код Элиаса).