ลองดูวิธีคิดที่แตกต่างกันเล็กน้อยเกี่ยวกับการเข้ารหัส Huffman
สมมติว่าคุณมีตัวอักษรสามสัญลักษณ์ A, B และ C ที่มีความน่าจะเป็น 0.5, 0.25 และ 0.25 เนื่องจากความน่าจะเป็นเป็นสิ่งที่ตรงกันข้ามกับกำลังสองดังนั้นจึงมีรหัส Huffman ซึ่งเหมาะสมที่สุด เราจะใช้รหัสมาตรฐานของแคนนอน 0, 10, 11 สำหรับตัวอย่างนี้
s
encode(s,A)encode(s,B)encode(s,C)=2s=4s+2=4s+3
งั้นมาเริ่มด้วย state 11 (ซึ่งคือ 1011 ใน binary), เข้ารหัสสัญลักษณ์ B รัฐใหม่คือ 46, ซึ่งคือ 1,01110 ใน binary อย่างที่คุณเห็นนี่คือสถานะ "เก่า" ที่มีการเพิ่มลำดับ 10 ลงไปท้าย เรามี "เอาต์พุต" เป็นลำดับบิต 10
จนถึงตอนนี้ดีมาก
[04,24)[24,34)[34,44)
โดยพื้นฐานสิ่งที่เราทำที่นี่คือการคูณทุกอย่างด้วยตัวส่วนร่วม ลองนึกภาพว่าสถานะอยู่ในฐาน 4 การเข้ารหัสสัญลักษณ์ B คือเอาท์พุท 2 ในฐานนั้นจริงๆและการเข้ารหัสสัญลักษณ์ C กำลังส่งออกตัวเลข 3 ในฐานนั้น
อย่างไรก็ตามสัญลักษณ์ A นั้นแตกต่างกันเล็กน้อยเนื่องจากไม่ใช่ตัวเลขทั้งหมดในฐาน 4
แต่เราสามารถคิดถึงตัวอักษรเป็นชุดของสัญลักษณ์ A_0, A_1, B, C โดยมีความน่าจะเป็นที่เท่ากัน นี่อีกครั้งมีรหัส Huffman ที่ดีที่สุด 00, 01, 10, 11 หรืออีกครั้งเราสามารถคิดถึงเรื่องนี้ในฐาน 4 เพื่อเข้ารหัสสัญลักษณ์เราแค่ทำ:
encode(s,A0)encode(s,A1)encode(s,B)encode(s,C)=4s+0=4s+1=4s+2=4s+3
A0A1
s
s′=⌊s2⌋
i=smod2
แล้ว(s'Ä_i)encode(s′,Ai)
ใช้ตัวอย่างก่อนหน้านี้ของเราเราจะพบว่าและแล้ว21 สถานะใหม่คือ 10101 ในไบนารีs=11s′=5i=1encode(5,A1)=4×5+1=21
ตอนนี้สิ่งนี้ไม่ได้สร้างเอาต์พุตบิตเดียวกับการเข้ารหัส Huffman แต่จะสร้างเอาต์พุตที่มีความยาวเท่ากัน และสิ่งที่ฉันหวังว่าคุณจะเห็นก็คือสิ่งนี้สามารถถอดรหัสได้โดยไม่ซ้ำกัน ในการถอดรหัสสัญลักษณ์เราใช้เวลาที่เหลือเมื่อหารด้วย 4 ถ้าค่าเป็น 2 หรือ 3 สัญลักษณ์นั้นคือ B หรือ C ตามลำดับ ถ้ามันเป็น 0 หรือ 1 สัญลักษณ์ก็คือ A จากนั้นเราก็สามารถใส่ข้อมูลกลับมาได้โดยการคูณสถานะด้วย 2 แล้วบวก 0 หรือ 1
สิ่งที่ดีเกี่ยวกับวิธีการนี้คือมันสามารถขยายการเข้ารหัสแบบเศษส่วนได้อย่างเป็นธรรมชาติเมื่อตัวเศษและ / หรือตัวหารของความน่าจะเป็นไม่ใช่พลังของทั้งสอง สมมติว่าเรามีสองสัญลักษณ์ A และ B ที่น่าจะเป็นของเป็นและน่าจะเป็นของ B คือ{5} จากนั้นเราสามารถเข้ารหัสสัญลักษณ์ด้วย:3525
encode(s,A0)encode(s,A1)encode(s,A2)encode(s,B0)encode(s,B1)=5s+0=5s+1=5s+2=5s+3=5s+4
การเข้ารหัสสัญลักษณ์ที่เราใช้และแล้ว(s'Ä_i)s′=⌊s3⌋i=smod3encode(s′,Ai)
นี่เทียบเท่ากับการเข้ารหัสทางคณิตศาสตร์ จริงๆแล้วมันเป็นตระกูลของวิธีการที่รู้จักกันในชื่อระบบ Asymmetric Numeralและได้รับการพัฒนาในช่วงไม่กี่ปีที่ผ่านมาโดย Jarek Duda ความหมายของชื่อควรชัดเจน: หากต้องการเข้ารหัสสัญลักษณ์ที่มีความน่าจะเป็นคุณจะขโมยตัวเลขหลัก -p จากรัฐแล้วเพิ่มตัวเลขหลัก -q ความไม่สมดุลมาจากการตีความสถานะเป็นตัวเลขในสองฐานที่แตกต่างกันpq
สาเหตุที่เป็นครอบครัวของวิธีการเข้ารหัสก็คือสิ่งที่เราเคยเห็นที่นี่เป็นสิ่งที่ไม่สามารถทำได้ด้วยตัวเอง มันต้องการการแก้ไขบางอย่างเพื่อจัดการกับความจริงที่ว่าคุณอาจไม่มีจำนวนเต็มความแม่นยำไม่สิ้นสุดเพื่อจัดการกับตัวแปรสถานะได้อย่างมีประสิทธิภาพและมีหลายวิธีที่คุณสามารถทำได้ แน่นอนการเข้ารหัสเลขคณิตมีปัญหาคล้ายกันกับความแม่นยำสำหรับสถานะของมัน
ตัวแปรที่เป็นประโยชน์ ได้แก่ rANS ("r" หมายถึง "อัตราส่วน") และ tANS ("ขับเคลื่อนด้วยตาราง")
ANS มีข้อได้เปรียบที่น่าสนใจเล็กน้อยเกี่ยวกับการเข้ารหัสทางคณิตศาสตร์ทั้งในทางปฏิบัติและทางทฤษฎี:
- ซึ่งแตกต่างจากการเข้ารหัสทางคณิตศาสตร์ "รัฐ" เป็นคำเดียวมากกว่าคำ
- ไม่เพียงแค่นั้น แต่ตัวเข้ารหัส ANS และตัวถอดรหัสที่เกี่ยวข้องมีสถานะที่เหมือนกันและการดำเนินการของพวกเขานั้นสมมาตรอย่างสมบูรณ์ สิ่งนี้ทำให้เกิดความเป็นไปได้ที่น่าสนใจเช่นคุณสามารถแทรกลำธารของสัญลักษณ์ที่เข้ารหัสต่างกันและทุกอย่างประสานกันได้อย่างสมบูรณ์แบบ
- แน่นอนว่าการติดตั้งใช้งานจริงจำเป็นต้องใช้ข้อมูล "เอาท์พุท" ในขณะที่คุณไปและไม่ใช่แค่รวบรวมเป็นจำนวนเต็มขนาดใหญ่เพื่อเขียนในตอนท้าย อย่างไรก็ตามขนาดของ "เอาท์พุท" สามารถกำหนดค่าตอบแทนการสูญเสียการบีบอัด ดังนั้นในกรณีที่ผู้เขียนเลขคณิตต้องส่งออกบิตทีละครั้ง ANS สามารถส่งออกไบต์หรือ nybble ในเวลา สิ่งนี้จะช่วยให้คุณแลกเปลี่ยนโดยตรงระหว่างความเร็วและการบีบอัด
- ดูเหมือนว่าจะเร็วเกี่ยวกับฮาร์ดแวร์รุ่นปัจจุบันเป็นการเข้ารหัสเลขฐานสองทางคณิตศาสตร์และดังนั้นจึงสามารถแข่งขันกับการเข้ารหัส Huffman สิ่งนี้ทำให้เร็วกว่าการเข้ารหัสเลขคณิตขนาดใหญ่และตัวแปร (เช่นการเข้ารหัสช่วง)
- ดูเหมือนว่าจะปลอดสิทธิบัตร
ฉันไม่คิดว่าฉันจะทำการเข้ารหัสทางคณิตศาสตร์อีกเลย