그렇지 않으면 그는 허풍과 퍼프를하고 집을 날려 버릴 것입니다!
그것은 전혀 관련이 없습니다. 이 과제는 실제로 허프만 코딩 에 관한 것 입니다. 그것의 요지는 주어진 텍스트에서 문자의 빈도가 표현을 더 짧게 만드는 데 사용됩니다. 다시 말해, 알파벳이 a
통과 z
하고 공간 이라고 가정 해 봅시다 . 27 자입니다. 5 비트는 32자를 수용 할 수있는 공간이 충분하기 때문에 각각 5 비트만으로 고유하게 인코딩 할 수 있습니다. 그러나 영어 나 일반적인 언어와 같은 여러 상황에서 일부 문자는 다른 문자보다 더 자주 사용됩니다. 보다 빈번한 문자에는 더 적은 비트를 사용하고 덜 빈번한 문자에는 더 많은 비트를 사용할 수 있습니다 . 그렇습니다. 비트 수는 전체적으로 절약되며 원본 텍스트는 여전히 고유하게 재구성 될 수 있습니다.
"이 질문은 허프만 코딩에 관한 것"을 예로 들어 봅시다. 이 텍스트의 길이는 37 자이며 일반적으로 37 * 8 = 296 비트이지만 각 문자에 5 비트 만 사용하는 경우 37 * 5 = 185 비트 입니다. 명심하십시오.
다음은 텍스트에서 각 문자와 그 빈도를 나타내는 (소르 타) 표입니다. 가장 빈번하지 않은 순서로 정렬됩니다 (_는 공백을 나타냅니다).
_ 5
i 4
n 3
o 3
s 3
t 3
u 3
a 2
f 2
h 2
b 1
c 1
d 1
e 1
g 1
m 1
q 1
관련된 최적 코딩은 다음과 같습니다.
_ 101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
이것이 모든 문자에 대해 5 비트를 사용하는 것보다 더 나은 인코딩이 될 것임을 즉시 분명해야합니다. 그래도 얼마나 나아 졌는지 알아 봅시다!
145 비트 , 185와 비교! 40 비트나 20 % 이상을 절약 할 수 있습니다! (물론 구조에 대한 정보를 디코딩 할 수 있다고 가정합니다.)이 코딩은 문자 표현을 변경하여 더 이상 비트를 삭제할 수 없기 때문에 최적입니다.
작업
- 하나의 매개 변수로 프로그램이나 함수를 작성하십시오 ...
- STDIN (또는 동등한) 또는 단일 인수로 입력을받습니다.
- 빈도별로 정렬 된 문자를 사용하여 위와 같이 최적의 허프만 코딩을 출력합니다 (주파수 클래스 내 순서는 중요하지 않음).
- 입력의 문자가 ASCII 범위
32..126
와 줄 바꾸기 로 제한되어 있다고 가정 할 수 있습니다 . - 입력이 10,000자를 넘지 않는다고 가정 할 수 있습니다. 이론적으로 입력은 제한이 없습니다.
- 코드는 합리적으로 빨리 완료되어야합니다. 위의 예는 최악의 경우 1 분 정도 소요됩니다. (이것은 무차별 대치를 배제하기위한 것입니다.)
- 점수는 바이트 단위입니다.
예
x
---
x 0
xxxxxxxxx
---
x 0
xxxxxxxxy
---
x 0
y 1 (these may be swapped)
xxxxxyyyz
---
x 0
y 10
z 11
uuvvwwxxyyzz
--- (or)
u 000 000
v 001 001
w 100 010
x 101 011
y 01 10
z 11 11
this question is about huffman coding
---
101
i 011
n 1100
o 1101
s 1110
t 1111
u 001
a 10011
f 0001
h 0101
b 00000
c 00001
d 01000
e 01001
g 10000
m 10001
q 10010
행복한 코딩!
참고 이 비슷한 질문이 밀접하게이 하나가 중복 심지어 점에 관련이있다. 그러나 지금까지 Meta에 대한 합의 는 오래된 것이이 복제본으로 간주되어야한다는 것입니다.
this question is about huffman coding
비트 수는 136이 아닌 145로 계산했습니다.