엘리아스 델타 부호화

Elias delta coding

Elias code코드 또는 Elias 델타코드Peter Elias가 [1]: 200 개발한 의 정수를 부호화하는 범용 코드입니다.

부호화

숫자 X 11을 코드화하려면:

  1. N = "log2 X"로 합니다. X의 2의 최대 거듭제곱이므로 2 µN X < 2입니다N+1.
  2. L = "log2 N+1"을 N+1의 2의 최대 거듭제곱으로 하여 2 µL N+1L+1 < 2라고 합니다.
  3. L 0을 쓰고 그 뒤에 0을 쓴다.
  4. N+1의 L+1비트 바이너리 표현에 이어
  5. X의 선행 비트(, 마지막 N 비트)를 제외한 모든 비트.

동일한 프로세스를 표현하는 동등한 방법:

  1. X를 2의 최대N 제곱과 나머지 N개의 이진수로 구분합니다.
  2. Elias 감마 부호화를 사용하여 N+1을 부호화합니다.
  3. 나머지 N개의 이진수를 N+1의 이 표현에 추가합니다.

x(\ x를 나타내기 위해 Elias 델타(\)는 2+ + 1displaystyle \ {를 사용합니다

대신 하여 시작됩니다.

번호 N N+1 § 부호화 암묵적
1 = 20 0 1 1 1/2
2 = 21 + 0 1 2 0 1 0 0 1/16
3 = 21 + 1 1 2 0 1 0 1 1/16
4 = 22 + 0 2 3 0 1 1 00 1/32
5 = 22 + 1 2 3 0 1 1 01 1/32
6 = 22 + 2 2 3 0 1 1 10 1/32
7 = 22 + 3 2 3 0 1 1 11 1/32
8 = 23 + 0 3 4 00 1 00 000 1/256
9 = 23 + 1 3 4 00 1 00 001 1/256
10 = 23 + 2 3 4 00 1 00 010 1/256
11 = 23 + 3 3 4 00 1 00 011 1/256
12 = 23 + 4 3 4 00 1 00 100 1/256
13 = 23 + 5 3 4 00 1 00 101 1/256
14 = 23 + 6 3 4 00 1 00 110 1/256
15 = 23 + 7 3 4 00 1 00 111 1/256
16 = 24 + 0 4 5 00 1 01 0000 1/512
17 = 24 + 1 4 5 00 1 01 0001 1/512

Elias 델타 코드화된 정수를 디코딩하려면:

  1. 스트림에서 제로를 읽고 첫 번째에 도달할 때까지 카운트합니다. 제로 카운트를 L이라고 부릅니다.
  2. 도달한 숫자가 정수의 첫 번째 자리라고 간주하고 값이L 2인 경우 나머지 L자리의 정수를 읽습니다.정수를 N+1이라고 하고, 1을 빼면 N이 됩니다.
  3. 최종N 출력의 첫 번째 자리에 값 2를 나타내는 1을 입력합니다.
  4. 다음 N자리 숫자를 읽고 추가합니다.

예:

001010011 1. 001 2. 선행 0. 2비트(예: 00101 3. N+1 = 00101 = 5 4. 전체 코드에 대한 N = 5 - 1 = 4비트(예: '0011' 5. 인코딩 번호 = 24 + 3 = 19)를 더 읽습니다.

이 코드는 Elias 감마 부호화에 설명된 것과 같은 방법으로 0 또는 음의 정수로 일반화할 수 있습니다.

코드 예시

부호화

무효 eliasDeltaEncode(* 원천, * 증류) {     IntReader 인트라더(원천);     비트라이터 비트 라이터(증류);     하는 동안에 (인트라더.왼쪽())     {         인트 숫자 = 인트라더.취득하다();         인트  = 0;         인트 length Of Len = 0;           = 1 + 바닥.(로그 2(숫자));  // 1+floor(log2(num) 계산)         length Of Len = 바닥.(로그 2()); // 플로어 계산(log2(len))                위해서 (인트 i = length Of Len; i > 0; --i)             비트 라이터.출력 비트(0);         위해서 (인트 i = length Of Len; i >= 0; --i)             비트 라이터.출력 비트(( >> i) & 1);         위해서 (인트 i = -2; i >= 0; i--)             비트 라이터.출력 비트((숫자 >> i) & 1);     }     비트 라이터.가까운.();     인트라더.가까운.(); } 

디코딩

무효 엘리아스델타디코드(* 원천, * 증류) {     비트 리더 비트 리더(원천);     IntWriter 인트라 라이터(증류);     하는 동안에 (비트 리더.왼쪽())     {         인트 숫자 = 1;         인트  = 1;         인트 length Of Len = 0;         하는 동안에 (!비트 리더.입력 비트())     // 잘못된 형식의 파일로 인해 위험할 수 있습니다.             length Of Len++;         위해서 (인트 i = 0; i < > length Of Len; i++)         {              <<=> 1;             한다면 (비트 리더.입력 비트())                  = 1;         }         위해서 (인트 i = 0; i < > -1; i++)         {             숫자 <<=> 1;             한다면 (비트 리더.입력 비트())                 숫자 = 1;         }         인트라 라이터.입력(숫자);            // 값을 씁니다.     }     비트 리더.가까운.();     인트라 라이터.가까운.(); } 

일반화

Elias 델타 부호화는 0 또는 음의 정수를 코드화하지 않습니다.음수가 아닌 모든 정수를 부호화하는 방법 중 하나는 부호화 전에 1을 더하고 복호화 후에 1을 빼는 것입니다.모든 정수를 코드화하는 한 가지 방법은 부호화하기 전에 모든 정수(0, 1, -1, 2, -2, 3, -3, ...)를 엄밀한 양의 정수(1, 2, 3, 4, 5, 6, 7, ...)에 매핑하는 분사를 설정하는 것입니다. 분사는 Protocol Buffers의 "ZigZag" 인코딩을 사용하여 수행할 수 있습니다(지그재그 코드 또는 JPEG 지그재그 엔트로피 코딩과 혼동하지 마십시오).

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b Elias, Peter (March 1975). "Universal codeword sets and representations of the integers". IEEE Transactions on Information Theory. 21 (2): 194–203. doi:10.1109/tit.1975.1055349.

추가 정보