มีลักษณะทั่วไปของการเข้ารหัส Huffman การเข้ารหัสทางคณิตศาสตร์หรือไม่


11

ในความพยายามที่จะเข้าใจความสัมพันธ์ระหว่าง Huffman Coding, เลขคณิต Coding และช่วงการเข้ารหัสที่ฉันเริ่มที่จะคิดว่าข้อบกพร่องของ Huffman การเข้ารหัสจะเกี่ยวข้องกับปัญหาของเศษส่วนบิตบรรจุ

นั่นคือสมมติว่าคุณมี 240 ค่าที่เป็นไปได้สำหรับสัญลักษณ์และจำเป็นต้องเข้ารหัสนี้เป็นบิตคุณจะติดกับ 8 บิตต่อสัญลักษณ์แม้ว่าคุณไม่ต้องการ "เต็ม" 8 เนื่องจาก 8 สามารถแสดง 256 ค่าที่เป็นไปได้ ต่อสัญลักษณ์ วิธีแก้ปัญหานี้คือสิ่งที่ฉันเคยเห็นเรียกว่า "การบรรจุบิตเศษส่วน" ซึ่งคุณสามารถ "bitshift" โดยไม่ใช้กำลังสองโดยใช้การคูณ เช่นเดียวกับการเพิ่มทวีคูณของ powers-of-two x * 2 == x << 1และx * 4 == x << 2สำหรับพลังทั้งหมดของสองดังนั้นคุณสามารถ "shift" ด้วย non-power-of-2 โดยการคูณแทนและแพ็คในสัญลักษณ์เศษส่วนขนาดบิต .

ปัญหาคล้ายกับการเข้ารหัส Huffman: คุณต้องจบด้วยรหัสที่ต้องมีความยาวไม่เป็นเศษส่วนขนาดบิตดังนั้นจึงมีการบรรจุที่ไม่มีประสิทธิภาพ อย่างไรก็ตามคุณไม่สามารถใช้โซลูชันของ fracitonal-bit-packing ได้เนื่องจากโซลูชันนี้จะใช้สัญลักษณ์ขนาดคงที่

คำถามคือมีเอกสารหรือวิธีแก้ไขเพื่อปรับปรุงการเข้ารหัส huffman ด้วยแนวคิดคล้ายกับเศษส่วนบิตบรรจุเพื่อให้บรรลุสิ่งที่คล้ายกับการเข้ารหัสเลขคณิตหรือไม่ (หรือผลลัพธ์ใด ๆ ในทางตรงกันข้าม)


1
การเข้ารหัสทางคณิตศาสตร์ดีที่สุดอยู่แล้ว ไม่จำเป็นต้องปรับปรุง
Yuval Filmus

@ YuvalFilmus ใช่ฉันหมายถึงวิธีการปรับปรุงในการเข้ารหัส huffman เพื่อนำมาขึ้นกับการเข้ารหัสทางคณิตศาสตร์
Realz Slaw

1
เช่นเดียวกับข้อเสนอแนะคุณอาจพบว่าการเข้ารหัส Asymmetric Numeral System (ANS) ง่ายต่อการเข้าใจมากกว่าการเข้ารหัสทางคณิตศาสตร์ โดยเฉพาะอย่างยิ่งมันง่ายกว่าที่จะเห็นสูตรเฉพาะเจาะจงดังกล่าวเป็น "การบรรจุเศษบิต"
นามแฝง

@ นามแฝงฉันพบหน้านี้ที่ดูเหมือนว่าจะทำให้การเชื่อมต่อระหว่าง rANS และ Huffman Coding นี้ ไม่สามารถพูดว่าฉันเข้าใจ แต่ยังคิดว่าเพียงพอ หากคุณแสดงความคิดเห็นคำตอบฉันจะยอมรับ
Realz Slaw

@ YuvalFilmus ฉันหวังว่าในกรณีที่การเข้ารหัสทางเลขคณิตจำเป็นต้องได้รับการปรับปรุงและ ANS ก็เป็นการปรับปรุง
นามแฝง

คำตอบ:


13

ลองดูวิธีคิดที่แตกต่างกันเล็กน้อยเกี่ยวกับการเข้ารหัส Huffman

สมมติว่าคุณมีตัวอักษรสามสัญลักษณ์ A, B และ C ที่มีความน่าจะเป็น 0.5, 0.25 และ 0.25 เนื่องจากความน่าจะเป็นเป็นสิ่งที่ตรงกันข้ามกับกำลังสองดังนั้นจึงมีรหัส Huffman ซึ่งเหมาะสมที่สุด เราจะใช้รหัสมาตรฐานของแคนนอน 0, 10, 11 สำหรับตัวอย่างนี้

s

encode(s,A)=2sencode(s,B)=4s+2encode(s,C)=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)=4s+0encode(s,A1)=4s+1encode(s,B)=4s+2encode(s,C)=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)=5s+0encode(s,A1)=5s+1encode(s,A2)=5s+2encode(s,B0)=5s+3encode(s,B1)=5s+4

การเข้ารหัสสัญลักษณ์ที่เราใช้และแล้ว(s'Ä_i)s=s3i=smod3encode(s,Ai)

นี่เทียบเท่ากับการเข้ารหัสทางคณิตศาสตร์ จริงๆแล้วมันเป็นตระกูลของวิธีการที่รู้จักกันในชื่อระบบ Asymmetric Numeralและได้รับการพัฒนาในช่วงไม่กี่ปีที่ผ่านมาโดย Jarek Duda ความหมายของชื่อควรชัดเจน: หากต้องการเข้ารหัสสัญลักษณ์ที่มีความน่าจะเป็นคุณจะขโมยตัวเลขหลัก -p จากรัฐแล้วเพิ่มตัวเลขหลัก -q ความไม่สมดุลมาจากการตีความสถานะเป็นตัวเลขในสองฐานที่แตกต่างกันpq

สาเหตุที่เป็นครอบครัวของวิธีการเข้ารหัสก็คือสิ่งที่เราเคยเห็นที่นี่เป็นสิ่งที่ไม่สามารถทำได้ด้วยตัวเอง มันต้องการการแก้ไขบางอย่างเพื่อจัดการกับความจริงที่ว่าคุณอาจไม่มีจำนวนเต็มความแม่นยำไม่สิ้นสุดเพื่อจัดการกับตัวแปรสถานะได้อย่างมีประสิทธิภาพและมีหลายวิธีที่คุณสามารถทำได้ แน่นอนการเข้ารหัสเลขคณิตมีปัญหาคล้ายกันกับความแม่นยำสำหรับสถานะของมัน

ตัวแปรที่เป็นประโยชน์ ได้แก่ rANS ("r" หมายถึง "อัตราส่วน") และ tANS ("ขับเคลื่อนด้วยตาราง")

ANS มีข้อได้เปรียบที่น่าสนใจเล็กน้อยเกี่ยวกับการเข้ารหัสทางคณิตศาสตร์ทั้งในทางปฏิบัติและทางทฤษฎี:

  • ซึ่งแตกต่างจากการเข้ารหัสทางคณิตศาสตร์ "รัฐ" เป็นคำเดียวมากกว่าคำ
  • ไม่เพียงแค่นั้น แต่ตัวเข้ารหัส ANS และตัวถอดรหัสที่เกี่ยวข้องมีสถานะที่เหมือนกันและการดำเนินการของพวกเขานั้นสมมาตรอย่างสมบูรณ์ สิ่งนี้ทำให้เกิดความเป็นไปได้ที่น่าสนใจเช่นคุณสามารถแทรกลำธารของสัญลักษณ์ที่เข้ารหัสต่างกันและทุกอย่างประสานกันได้อย่างสมบูรณ์แบบ
  • แน่นอนว่าการติดตั้งใช้งานจริงจำเป็นต้องใช้ข้อมูล "เอาท์พุท" ในขณะที่คุณไปและไม่ใช่แค่รวบรวมเป็นจำนวนเต็มขนาดใหญ่เพื่อเขียนในตอนท้าย อย่างไรก็ตามขนาดของ "เอาท์พุท" สามารถกำหนดค่าตอบแทนการสูญเสียการบีบอัด ดังนั้นในกรณีที่ผู้เขียนเลขคณิตต้องส่งออกบิตทีละครั้ง ANS สามารถส่งออกไบต์หรือ nybble ในเวลา สิ่งนี้จะช่วยให้คุณแลกเปลี่ยนโดยตรงระหว่างความเร็วและการบีบอัด
  • ดูเหมือนว่าจะเร็วเกี่ยวกับฮาร์ดแวร์รุ่นปัจจุบันเป็นการเข้ารหัสเลขฐานสองทางคณิตศาสตร์และดังนั้นจึงสามารถแข่งขันกับการเข้ารหัส Huffman สิ่งนี้ทำให้เร็วกว่าการเข้ารหัสเลขคณิตขนาดใหญ่และตัวแปร (เช่นการเข้ารหัสช่วง)
  • ดูเหมือนว่าจะปลอดสิทธิบัตร

ฉันไม่คิดว่าฉันจะทำการเข้ารหัสทางคณิตศาสตร์อีกเลย


4
ตอนนี้เป็นคำอธิบายที่ชัดเจนที่สุดในการเข้ารหัส ANS ที่ฉันเคยเห็น
Michael Deardeuff

2

ตัวอย่างง่ายๆถ้าคุณมีสามสัญลักษณ์ที่มีความน่าจะเป็น 1 ใน 3 แต่ละการเข้ารหัส Huffman ที่ดีที่สุดของคุณจะใช้สัญลักษณ์สามตัวคือ 0, 10 และ 11 โดยมีค่าเฉลี่ย 5 บิตที่ 3

มีสัญลักษณ์ 243 รายการที่สร้างขึ้นโดยเชื่อมต่อสัญลักษณ์ดั้งเดิม 5 รายการโดยแต่ละรายการมีความน่าจะเป็น 1/243 ซึ่งใกล้เคียงกับ 1/256 มาก การเข้ารหัส Huffman ที่ดีที่สุดจะเข้ารหัส 13 กลุ่มเหล่านี้ใน 7 บิตและ 230 กลุ่มใน 8 บิตโดยเฉลี่ย 7.9465 บิตต่อกลุ่มหรือ 1.5893 บิตต่อสัญลักษณ์ดั้งเดิมลดลงจาก 1.6667 บิตสำหรับการเข้ารหัส Huffman ดั้งเดิมโดยมีการเข้ารหัสทางคณิตศาสตร์ 1.5850 เกร็ด

ดังนั้นในทางทฤษฎีคุณสามารถรวมสองสัญลักษณ์เข้าด้วยกันเป็นหนึ่งสัญลักษณ์ที่ใหญ่กว่าหรือสามสัญลักษณ์ต่อกันเป็นหนึ่งสัญลักษณ์ที่ใหญ่กว่าและใช้การเข้ารหัส Hufman สำหรับการรวมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.