Nếu không anh ta sẽ giận dữ và thổi phồng và thổi bay ngôi nhà của bạn!
Điều đó hoàn toàn không liên quan. Thách thức này thực sự là về mã hóa Huffman . Điểm chính của nó là tần số các ký tự trong một văn bản đã cho được sử dụng để làm cho biểu diễn của nó ngắn hơn. Nói cách khác, hãy nói rằng bảng chữ cái của chúng ta a
xuyên qua z
và không gian. Đó là 27 ký tự. Mỗi trong số chúng có thể được mã hóa duy nhất chỉ trong 5 bit vì 5 bit có đủ chỗ cho 32 ký tự. Tuy nhiên, trong nhiều tình huống (như tiếng Anh hoặc ngôn ngữ nói chung), một số nhân vật thường xuyên hơn những người khác. Chúng ta có thể sử dụng ít bit hơn cho các ký tự thường xuyên hơn và (có lẽ) nhiều bit hơn cho các ký tự ít thường xuyên hơn. Thực hiện đúng, có một khoản tiết kiệm tổng thể về số lượng bit và văn bản gốc vẫn có thể được xây dựng lại một cách duy nhất.
Hãy lấy "câu hỏi này là về mã hóa huffman" làm ví dụ. Văn bản này dài 37 ký tự, sẽ là 37 * 8 = 296 bit thông thường, mặc dù chỉ có 37 * 5 = 185 bit nếu chúng ta chỉ sử dụng 5 bit cho mỗi ký tự. Ghi nhớ nó trong tâm trí.
Dưới đây là bảng (sắp xếp) của mỗi ký tự và tần số của chúng trong văn bản, được sắp xếp từ hầu hết đến ít thường xuyên nhất (trong đó _ đứng trong một khoảng trắng):
_ 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
Một mã hóa tối ưu liên quan có thể là:
_ 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
Cần phải rõ ràng rằng đây sẽ là một mã hóa tốt hơn so với việc chỉ sử dụng 5 bit cho mỗi ký tự. Tuy nhiên, hãy tìm hiểu xem tốt hơn bao nhiêu!
145 bit , so với 185! Đó là một khoản tiết kiệm 40 bit, hoặc chỉ hơn 20%! (Tất nhiên, điều này là giả sử rằng thông tin về cấu trúc có sẵn để giải mã.) Mã hóa này là tối ưu vì không thể bỏ thêm bit nào bằng cách thay đổi bất kỳ biểu diễn nào của ký tự.
Nhiệm vụ
- Viết chương trình hoặc hàm với một tham số ...
- Lấy đầu vào từ STDIN (hoặc tương đương) hoặc dưới dạng một đối số.
- Xuất ra một mã Huffman tối ưu như trên với các ký tự được sắp xếp theo tần số (thứ tự trong một lớp tần số không thành vấn đề).
- Bạn có thể cho rằng các ký tự trong đầu vào bị giới hạn trong phạm vi ASCII
32..126
cộng với một dòng mới. - Bạn có thể giả sử đầu vào không dài hơn 10.000 ký tự (lý tưởng là về lý thuyết, đầu vào không bị ràng buộc).
- Mã của bạn sẽ hoàn thành hợp lý nhanh chóng. Ví dụ đưa ra ở trên sẽ mất không quá một phút hoặc lâu nhất là tồi tệ nhất. (Điều này nhằm loại trừ lực lượng vũ phu.)
- Ghi điểm được tính bằng byte.
Ví dụ
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
Chúc mừng mã hóa!
Lưu ý rằng câu hỏi tương tự này có liên quan chặt chẽ, thậm chí đến mức câu hỏi này là trùng lặp. Tuy nhiên, sự đồng thuận cho đến nay về Meta là cái cũ hơn nên được coi là một bản sao của cái này.
this question is about huffman coding
, tôi đã đếm số bit là 145 , không phải 136.