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


Из Википедии, бесплатной энциклопедии
  (Перенаправлено из дельта-кода Элиаса )
Перейти к навигации Перейти к поиску

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

Кодирование

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

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

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

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

Для представления числа дельта Элиаса (δ) использует биты. [1] : 200

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

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

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

Пример:

001010011
1. 2 ведущих нуля в 001
2. Прочтите еще 2 бита, т.е. 00101
3. декодировать N + 1 = 00101 = 5
4. получить N = 5 - 1 = 4 оставшихся бита для полного кода, т.е. '0011'
5. закодированное число = 2 4 + 3 = 19

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

Пример кода

Кодирование

void  eliasDeltaEncode ( char *  source ,  char *  dest ) {  IntReader  intreader ( source );  BitWriter  bitwriter ( dest );  в то время как  ( intreader . hasLeft ())  {  int  num  =  intreader . getInt ();  int  len  =  0 ;  int  lengthOfLen  =  0 ; len  =  1  +  этаж ( log2 ( num ));  // вычисляем 1 + этаж (log2 (num))  lengthOfLen  =  floor ( log2 ( len ));  // вычисляем этаж (log2 (len)) для  ( int  i  =  lengthOfLen ;  i  >  0 ;  - i )  битовая запись . outputBit ( 0 );  для  ( int  i  =  lengthOfLen ;  i  > =  0 ;  - i )  битовая запись . outputBit (( len  >>  я )  &  1 );  для  ( int  i  =  len -2 ;  i  > = 0 ;  i - )  bitwriter . outputBit (( число  >>  я )  &  1 );  }  bitwriter . закрыть ();  читатель . закрыть (); }

Расшифровка

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

Обобщения

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

Смотрите также

использованная литература

  1. ^ а б Элиас, Питер (март 1975). «Универсальные наборы кодовых слов и представления целых чисел». IEEE Transactions по теории информации . 21 (2): 194–203. DOI : 10,1109 / tit.1975.1055349 .

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