Jump to content

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

Код Элиаса δ или дельта-код Элиаса — это универсальный код , кодирующий положительные целые числа, разработанный Питером Элиасом . [1] : 200 

Кодирование

[ редактировать ]

Чтобы закодировать число X ≥ 1:

  1. Пусть N = ⌊log 2 X ⌋; быть высшей степенью 2 в X , поэтому 2 Н Х < 2 Н +1 .
  2. Пусть L = ⌊log 2 N +1⌋ — высшая степень двойки в N +1, поэтому 2 л N +1 < 2 Л +1 .
  3. Напишите L нулей, а затем
  4. L N +1-битное двоичное представление +1 , за которым следует
  5. все, кроме ведущего бита (т.е. последних N бит) X .

Эквивалентный способ выразить тот же процесс:

  1. Разделите X на высшую степень двойки, которую он содержит (2 Н ) и оставшиеся N двоичных цифр.
  2. Закодируйте N +1 с помощью гамма-кодирования Элиаса .
  3. Добавьте оставшиеся N двоичных цифр к этому представлению N +1.

Чтобы представить число , используется дельта Элиаса (δ) биты. [1] : 200  Это полезно для очень больших целых чисел, когда общее количество битов закодированного представления оказывается меньше [чем можно было бы получить с помощью гамма-кодирования Элиаса ] из-за часть предыдущего выражения.

Код начинается с использования вместо :

Число Н Н+1 δ-кодирование Подразумеваемая вероятность
1 = 2 0 0 1 11/2
2 = 2 1 + 0 1 2 0 1 0 01/16
3 = 2 1 + 1 1 2 0 1 0 11/16
4 = 2 2 + 0 2 3 0 1 1 001/32
5 = 2 2 + 1 2 3 0 1 1 011/32
6 = 2 2 + 2 2 3 0 1 1 101/32
7 = 2 2 + 3 2 3 0 1 1 111/32
8 = 2 3 + 0 3 4 00 1 00 0001/256
9 = 2 3 + 1 3 4 00 1 00 0011/256
10 = 2 3 + 2 3 4 00 1 00 0101/256
11 = 2 3 + 3 3 4 00 1 00 0111/256
12 = 2 3 + 4 3 4 00 1 00 1001/256
13 = 2 3 + 5 3 4 00 1 00 1011/256
14 = 2 3 + 6 3 4 00 1 00 1101/256
15 = 2 3 + 7 3 4 00 1 00 1111/256
16 = 2 4 + 0 4 5 00 1 01 00001/512
17 = 2 4  +  1 4 5 00 1 01 00011/512

Чтобы декодировать целое число, закодированное дельта-кодом Элиаса:

  1. Прочитайте и посчитайте нули из потока, пока не дойдете до первого. Назовите это количество нулей L .
  2. Учитывая, что достигнутая цифра является первой цифрой целого числа со значением 2 л , прочитайте оставшиеся L цифр целого числа. Назовите это целое число N +1 и вычтите единицу, чтобы получить N .
  3. Поместите единицу на первое место нашего окончательного результата, обозначая значение 2. Н .
  4. Прочитайте и добавьте следующие N цифр.

Пример:

0010100111. 2 ведущих нуля в числе 001.2. прочитать еще 2 бита, т.е. 001013. декодируем N+1 = 00101 = 54. получить N = 5 − 1 = 4 оставшихся бита для полного кода, т. е. «0011».5. закодированное число = 2 4  + 3 = 19 

Этот код можно обобщить до нуля или отрицательных целых чисел теми же способами, что описаны в гамма-кодировании Элиаса .

Пример кода

[ редактировать ]

Кодирование

[ редактировать ]
void   eliasDeltaEncode  (  char  *   source  ,   char  *   dest  )  {      IntReader   intreader  (  source  );      BitWriter   битрайтер  (  dest  );      в то время как   (  intreader  .  hasLeft  ())      {          int   num   =   intreader  .  получитьИнт  ();          интервал   Лен   =   0  ;          int   lengthOfLen   =   0  ;          len   =   1   +   пол  (  log2  (  число  ));    // вычисляем 1+floor(log2(num))          lengthOfLen   =   Floor  (  log2  (  len  ));   // вычисление Floor(log2(len)                для   (  int   i   =   lengthOfLen  ;   i   >   0  ;   --i  bitwriter  )              )  .  выходной бит  (  0  );          for   (  int   i   =   lengthOfLen  ;   i   >=   0  ;   --  i  )              bitwriter  .  выходной бит  ((  len   >>   i  )   &   1  );          for   (  int   i   =   len  -2  ;   i   >=   0  ;   i  --  )              bitwriter  .  выходной бит  ((  число   >>   i  )   &   1  );      }      битрайтер  .  закрывать  ();      интертредер  .  закрывать  ();  } 

Декодирование

[ редактировать ]
void   eliasDeltaDecode  (  char  *   source  ,   char  *   dest  )  {      BitReader   bitreader  (  source  );      IntWriter   intwriter  (  место назначения  );      while   (  bitreader  .  hasLeft  ())      {          int   num   =   1  ;          интервал   Лен   =   1  ;          int   lengthOfLen   =   0  ;          while   (  !  bitreader  .  inputBit  ())       // потенциально опасно для некорректных файлов.              длинаОфЛен  ++  ;          for   (  int   я   =   0  ;   я   <   lengthOfLen  ;   я  ++  )          {              len   <<=   1  ;              если   (  bitreader  .  inputBit  ())                  len   |=   1  ;          }          for   (  int   я   =   0  ;   я   <   len  -1  ;   я  ++  )          {              num   <<=   1  ;              если   (  bitreader  .  inputBit  ())                  число   |=   1  ;          }          Инрайтер  .  putInt  (  число  );              // записываем значение      }      bitreader  .  закрывать  ();      автор  .  закрывать  ();  } 

Обобщения

[ редактировать ]

Дельта-кодирование Элиаса не кодирует ноль или отрицательные целые числа.Один из способов кодирования всех неотрицательных целых чисел — добавить 1 перед кодированием, а затем вычесть 1 после декодирования.Один из способов кодирования всех целых чисел — установить биекцию , отображающую целые числа, все целые числа (0, 1, −1, 2, −2, 3, −3, ...) в строго положительные целые числа (1, 2, 3, 4, 5, 6, 7, ...) перед кодированием.Эту биекцию можно выполнить с использованием кодировки «ZigZag» из протокольных буферов (не путать с кодом Zigzag или зигзагообразным энтропийным кодированием JPEG ).

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б Элиас, Питер (март 1975 г.). «Универсальные наборы кодовых слов и представления целых чисел». Транзакции IEEE по теории информации . 21 (2): 194–203. дои : 10.1109/тит.1975.1055349 .

Дальнейшее чтение

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 8794354a3bb66785529df93ae19d2742__1705133640
URL1:https://arc.ask3.ru/arc/aa/87/42/8794354a3bb66785529df93ae19d2742.html
Заголовок, (Title) документа по адресу, URL1:
Elias delta coding - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)