← กลับไปยังบทความทั้งหมด

การเข้ารหัสแบบความยาวแปรผัน

สรุปใจความสำคัญ

  • ใช้รหัสที่มีความยาวต่างกัน โดยสัญลักษณ์ที่พบบ่อยจะใช้รหัสสั้นเพื่อประหยัดพื้นที่
  • เป็นพื้นฐานสำคัญของการบีบอัดข้อมูลแบบไม่สูญเสีย (Lossless Compression)
  • UTF-8 เป็นตัวอย่างที่แพร่หลายที่สุดของการเข้ารหัสตัวอักษรแบบความยาวแปรผัน
  • Prefix codes เป็นประเภทรหัสที่ถอดรหัสได้ง่ายที่สุดเพราะไม่มีรหัสใดเป็นส่วนเริ่มต้นของรหัสอื่น

การเข้ารหัสแบบความยาวแปรผัน (Variable-length encoding) คือรูปแบบการกำหนดรหัสในทฤษฎีการเข้ารหัส (Coding Theory) ที่ใช้รหัสที่มีความยาวแตกต่างกันในการแทนค่าสัญลักษณ์ต่างๆ เพื่อนำไปใช้ในการส่งผ่านช่องทางการสื่อสารหรือจัดเก็บในสื่อบันทึกข้อมูล ในทางวิทยาการคอมพิวเตอร์ แนวคิดนี้มีความเกี่ยวข้องโดยตรงกับการจัดการสายบิต (Bit string) เพื่อให้การใช้พื้นที่จัดเก็บมีประสิทธิภาพสูงสุด

หลักการทำงานและความสำคัญ

จุดเด่นของการเข้ารหัสแบบความยาวแปรผันคือความสามารถในการบีบอัดข้อมูลแบบไม่สูญเสีย (Lossless data compression) โดยการกำหนดให้สัญลักษณ์ที่ปรากฏบ่อยครั้งใช้รหัสที่มีความยาวสั้น และสัญลักษณ์ที่ปรากฏน้อยครั้งใช้รหัสที่มีความยาวมากกว่า ส่งผลให้ค่าเฉลี่ยของความยาวรหัสลดลงและประหยัดพื้นที่จัดเก็บ

แนวคิดนี้แตกต่างจากการเข้ารหัสแบบความยาวคงที่ (Fixed-length coding) ซึ่งข้อมูลทุกตัวจะใช้จำนวนบิตเท่ากัน ทำให้การบีบอัดข้อมูลทำได้ยากกว่าและมักต้องจัดการข้อมูลเป็นบล็อกขนาดใหญ่เพื่อให้เกิดประสิทธิภาพ

การประยุกต์ใช้ในระบบคอมพิวเตอร์

การเข้ารหัสตัวอักษรแบบหลายไบต์ (Multibyte Encodings)

การเข้ารหัสแบบหลายไบต์มักถูกพัฒนาขึ้นเพื่อเพิ่มจำนวนตัวอักษรที่สามารถแทนค่าได้ โดยที่ยังคงความสามารถในการทำงานร่วมกับระบบเก่า (Backward compatibility) ตัวอย่างที่ชัดเจนที่สุดคือ UTF-8 ซึ่งใช้ความยาวแปรผันตั้งแต่ 1 ถึง 4 ไบต์ต่อหนึ่งตัวอักษร

ในระบบ UTF-8 จะมีการแบ่งประเภทของหน่วยข้อมูลออกเป็น 3 ประเภทหลัก ได้แก่:

  • Singleton: หน่วยข้อมูลเดี่ยวที่แทนตัวอักษรได้ทันที (เช่น ตัวอักษรภาษาอังกฤษในมาตรฐาน ASCII)
  • Lead unit: หน่วยนำหน้าสำหรับตัวอักษรที่ต้องใช้หลายไบต์
  • Trail unit: หน่วยตามหลังที่ใช้ร่วมกับหน่วยนำหน้าเพื่อระบุตัวอักษรที่สมบูรณ์

ตัวอย่างเช่น ข้อความ "I♥NY" ในรูปแบบ UTF-8 จะประกอบด้วยรหัสฐานสิบหก 49 E2 99 A5 4E 59 โดยที่ 49, 4E และ 59 เป็น Singleton ในขณะที่ E2 เป็น Lead unit และ 99 กับ A5 เป็น Trail unit ที่รวมกันเพื่อแทนสัญลักษณ์รูปหัวใจ (♥)

สัญลักษณ์เซต S ในทางคณิตศาสตร์
การกำหนดเซต S ซึ่งเป็นแหล่งกำเนิดของสัญลักษณ์ในทฤษฎีการเข้ารหัส

กลยุทธ์การเข้ารหัสที่สำคัญ

มีอัลกอริทึมหลายตัวที่ใช้หลักการความยาวแปรผันเพื่อเพิ่มประสิทธิภาพในการบีบอัดข้อมูล เช่น:

  • Huffman Coding: การสร้างต้นไม้การเข้ารหัสตามความถี่ของข้อมูล
  • Lempel–Ziv Coding: การใช้พจนานุกรมเพื่อแทนที่ลำดับข้อมูลที่ซ้ำกัน
  • Arithmetic Coding: การแทนที่ข้อความทั้งหมดด้วยตัวเลขทศนิยมเพียงตัวเดียวในช่วง 0 ถึง 1
  • Context-adaptive variable-length coding (CAVLC): การเข้ารหัสที่ปรับเปลี่ยนตามบริบทของข้อมูลรอบข้าง
สัญลักษณ์เซต T ในทางคณิตศาสตร์
การกำหนดเซต T ซึ่งเป็นเป้าหมายของการแปลงรหัส

โครงสร้างทางคณิตศาสตร์และการจำแนกประเภท

ในทางทฤษฎี การขยายของรหัส (Extension of a code) คือการจับคู่ลำดับของสัญลักษณ์จากเซตแหล่งกำเนิด (S) ไปยังสายบิตในเซตเป้าหมาย (T) โดยการนำรหัสของแต่ละสัญลักษณ์มาต่อกัน

ฟังก์ชันการเข้ารหัส C:S ไปยัง T<em>
ฟังก์ชันการแมปสัญลักษณ์จากเซต S ไปยังลำดับของสัญลักษณ์ในเซต T

รหัสแบบความยาวแปรผันสามารถแบ่งระดับความเข้มงวดได้ดังนี้:

  1. Non-singular codes: รหัสที่สัญลักษณ์แต่ละตัวถูกแมปไปยังสายบิตที่แตกต่างกัน (Injective mapping) เพื่อป้องกันการสูญเสียข้อมูล
  2. Uniquely decodable codes: รหัสที่เมื่อนำมาต่อกันเป็นสายยาวแล้ว สามารถถอดรหัสกลับเป็นลำดับสัญลักษณ์เดิมได้อย่างถูกต้องเพียงรูปแบบเดียว
  3. Prefix codes: รหัสที่ไม่มีรหัสของสัญลักษณ์ใดเป็นส่วนเริ่มต้น (Prefix) ของรหัสสัญลักษณ์อื่น ซึ่งเป็นคุณสมบัติที่ทำให้การถอดรหัสทำได้ง่ายและรวดเร็วที่สุด
สัญลักษณ์ฟังก์ชัน C
การแสดงความสัมพันธ์ของฟังก์ชันการเข้ารหัส
สัญลักษณ์ S</em>
การดำเนินการบนเซตของลำดับสัญลักษณ์ S
สัญลักษณ์ T
การดำเนินการบนเซตของลำดับเป้าหมาย T

คำถามที่พบบ่อย

การเข้ารหัสแบบความยาวแปรผันต่างจากการเข้ารหัสแบบความยาวคงที่อย่างไร?

การเข้ารหัสแบบความยาวคงที่ใช้จำนวนบิตเท่ากันสำหรับทุกสัญลักษณ์ ทำให้ง่ายต่อการเข้าถึงข้อมูลตำแหน่งที่แน่นอน แต่สิ้นเปลืองพื้นที่ ส่วนการเข้ารหัสแบบความยาวแปรผันใช้จำนวนบิตตามความถี่ของข้อมูล ทำให้บีบอัดข้อมูลได้ดีกว่าแต่การถอดรหัสมีความซับซ้อนกว่า

ทำไม UTF-8 ถึงถูกจัดเป็นการเข้ารหัสแบบความยาวแปรผัน?

เพราะ UTF-8 ใช้จำนวนไบต์ในการแทนตัวอักษรไม่เท่ากัน โดยตัวอักษรภาษาอังกฤษพื้นฐานจะใช้เพียง 1 ไบต์ ในขณะที่ตัวอักษรในภาษาอื่นหรือสัญลักษณ์พิเศษอาจใช้ 2 ถึง 4 ไบต์

Prefix Code คืออะไรและสำคัญอย่างไร?

Prefix Code คือรหัสที่ไม่มีรหัสของสัญลักษณ์ใดเป็นจุดเริ่มต้นของรหัสสัญลักษณ์อื่น ทำให้คอมพิวเตอร์สามารถถอดรหัสได้ทันทีที่อ่านบิตจนครบชุดโดยไม่ต้องรออ่านบิตถัดไปเพื่อตรวจสอบ