Дельта-код Элиаса

Материал из in.wiki
Перейти к навигации Перейти к поиску

Дельта-код Элиаса  — это универсальный код для кодирования положительных целых чисел, разработанный Питером Элиасом.

Для того, чтобы закодировать число N:

  1. Записать N в двоичном виде.
  2. Сосчитать значащие биты в N и записать их количество в двоичном виде (Х)
  3. В двоичном представлении N, полученном на шаге 1, удалить старший бит и запомнить результат (Y).
  4. К X присоединить Y.
  5. Добавить в начало число нулей, на единицу меньшее количества значащих бит в двоичном представлении X.

Аналогичным образом этот процесс можно описать так:

  1. Разделить целое число на самую большую степень 2, которую оно содержит (2N'), и оставшиеся N' двоичных цифр целого числа.
  2. Закодировать N = N' + 1 с помощью гамма-кода Элиаса.
  3. Добавить оставшиеся 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. Прочитать и сосчитать количество нулей из потока, пока не встретится 1. Пусть L — количество нулей.
  2. Учитывая, что единица, которая была достигнута — это первая цифра целого числа, значение которого 2L, прочитать оставшиеся L цифр этого целого числа. Пусть N — прочитанное число.
  3. Поместить единицу на первое место конечного вывода, который представляет собой значение 2N-1. Прочитать и добавить следующие N-1 цифр.

Пример:

001010001
  1. Читаем из потока 001 и определяем, что в начале кода 2 ведущих ноля.
  2. Читаем из потока еще 2 бита, то есть вместе с результатом первого шага получаем код 00101.
  3. Декодируем 00101 = 5.
  4. получится N' = 5 — 1 = 4 оставшихся бита для полного кода, то есть '0001'=1.
  5. Закодированное число = 24 + 1 = 17.

Этот код может быть также применён к целым числам с нулевым или отрицательным значением (см.: гамма-код Элиаса).

См. также

en:Elias delta coding ko:엘리어스 델타 부호 ja:デルタ符号