엘리아스 델타 부호화
Elias delta codingElias code코드 또는 Elias 델타코드는 Peter Elias가 [1]: 200 개발한 양의 정수를 부호화하는 범용 코드입니다.
부호화
숫자 X 11을 코드화하려면:
- N = "log2 X"로 합니다. X의 2의 최대 거듭제곱이므로 2 µN X < 2입니다N+1.
- L = "log2 N+1"을 N+1의 2의 최대 거듭제곱으로 하여 2 µL N+1L+1 < 2라고 합니다.
- L 0을 쓰고 그 뒤에 0을 쓴다.
- N+1의 L+1비트 바이너리 표현에 이어
- X의 선행 비트(즉, 마지막 N 비트)를 제외한 모든 비트.
동일한 프로세스를 표현하는 동등한 방법:
- X를 2의 최대N 제곱과 나머지 N개의 이진수로 구분합니다.
- Elias 감마 부호화를 사용하여 N+1을 부호화합니다.
- 나머지 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 델타 코드화된 정수를 디코딩하려면:
- 스트림에서 제로를 읽고 첫 번째에 도달할 때까지 카운트합니다.이 제로 카운트를 L이라고 부릅니다.
- 도달한 숫자가 정수의 첫 번째 자리라고 간주하고 값이L 2인 경우 나머지 L자리의 정수를 읽습니다.이 정수를 N+1이라고 하고, 1을 빼면 N이 됩니다.
- 최종N 출력의 첫 번째 자리에 값 2를 나타내는 1을 입력합니다.
- 다음 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 지그재그 엔트로피 코딩과 혼동하지 마십시오).
「 」를 참조해 주세요.
레퍼런스
- ^ 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.
추가 정보
- Hamada, Hozumi (June 1983). "URR: Universal representation of real numbers". New Generation Computing. 1 (2): 205–209. doi:10.1007/BF03037427. ISSN 0288-3635. Retrieved 2018-07-09. (NB. Elias code코드는 Hamada의 URR 표현과 일치합니다.)