มิฉะนั้นเขาจะโกรธและพองและระเบิดบ้านของคุณ!
นั่นไม่เกี่ยวข้องอย่างสมบูรณ์ ความท้าทายนี้เป็นจริงเกี่ยวกับHuffman การเข้ารหัส ส่วนสำคัญของมันคือความถี่ของตัวละครในข้อความที่กำหนดจะถูกใช้เพื่อทำให้การแสดงสั้นลง กล่าวอีกนัยหนึ่งสมมติว่าตัวอักษรของเราa
ผ่านไปz
และผ่านช่องว่าง นั่นคือ 27 ตัวอักษร แต่ละรหัสสามารถเข้ารหัสได้ใน 5 บิตเพราะ 5 บิตมีพื้นที่เพียงพอสำหรับ 32 อักขระ อย่างไรก็ตามในหลาย ๆ สถานการณ์ (เช่นภาษาอังกฤษหรือภาษาทั่วไป) ตัวละครบางตัวจะบ่อยกว่าตัวละครอื่น ๆ เราสามารถใช้บิตน้อยลงสำหรับอักขระบ่อยขึ้นและ (อาจ) บิตเพิ่มเติมสำหรับอักขระบ่อยน้อย ถูกต้องแล้วมีการประหยัดโดยรวมในจำนวนบิตและข้อความต้นฉบับยังคงสามารถสร้างขึ้นใหม่ได้โดยไม่ซ้ำกัน
ลอง "คำถามนี้เกี่ยวกับการเข้ารหัส huffman" เป็นตัวอย่าง ข้อความนี้มีความยาว 37 ตัวอักษรซึ่งปกติจะเป็น 37 * 8 = 296 บิตโดยปกติจะมีเพียง 37 * 5 = 185 บิตหากเราใช้ 5 บิตสำหรับแต่ละอักขระเท่านั้น เก็บไว้ในใจ
นี่คือตาราง (sorta) ของตัวละครแต่ละตัวและความถี่ในข้อความเรียงจากมากไปน้อยบ่อย (โดยที่ _ ย่อมาจาก space):
_ 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 (หรือเทียบเท่า) หรือเป็นอาร์กิวเมนต์เดี่ยว
- เอาท์พุทการเข้ารหัส Huffman ที่ดีที่สุดข้างต้นด้วยตัวอักษรที่เรียงตามความถี่ (ลำดับภายในคลาสความถี่ไม่สำคัญ)
- คุณอาจสมมติว่าอักขระในอินพุตถูก จำกัด ช่วง ASCII
32..126
บวกกับขึ้นบรรทัดใหม่ - คุณอาจสมมติว่าอินพุตไม่เกิน 10,000 ตัวอักษร (โดยหลักแล้วทฤษฎีควรป้อนข้อมูลไม่ จำกัด )
- รหัสของคุณควรเสร็จเร็วพอสมควร ตัวอย่างที่ให้มาข้างต้นไม่ควรเกินหนึ่งนาทีหรือแย่ที่สุด (นี่มีวัตถุประสงค์เพื่อแยกแยะกำลังดุร้าย)
- การให้คะแนนอยู่ในหน่วยไบต์
ตัวอย่าง
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
คุณฉันนับจำนวนบิตเป็น145ไม่ใช่ 136