ทำไมรหัสนี้สามารถถอดรหัสได้โดยไม่ซ้ำกัน?


21

ตัวอักษรต้นฉบับ:{a,b,c,d,e,f}

รหัสตัวอักษร:{0,1}

  • a:0101
  • b:1001
  • c:10
  • d:000
  • e:11
  • f:100

ฉันคิดว่าสำหรับรหัสที่จะถอดรหัสได้โดยไม่ซ้ำกันมันจะต้องมีคำนำหน้าฟรี แต่ในรหัสนี้ codewordเป็นคำนำหน้าของ codewordตัวอย่างเช่นดังนั้นจึงไม่ใช่คำนำหน้าฟรี อย่างไรก็ตามตำราของฉันบอกฉันว่าสิ่งที่ตรงกันข้ามนั้นไม่มีค่านำหน้า (ฉันไม่เข้าใจสิ่งนี้) และดังนั้นจึงสามารถถอดรหัสได้โดยไม่ซ้ำกัน ใครสามารถอธิบายความหมายนี้หรือทำไมมันสามารถถอดรหัสได้โดยไม่ซ้ำกัน? ฉันรู้ว่ามันเป็นไปตามความไม่เสมอภาคของคราฟท์ แต่นั่นเป็นเพียงเงื่อนไขที่จำเป็นไม่ใช่เงื่อนไขที่เพียงพอcf


10
คำนำหน้าหมายถึงการถอดรหัสโดยไม่ซ้ำกัน แต่มันไม่ได้เป็นคำสั่ง "ถ้าเพียง แต่ถ้า" ดูตัวอย่างเช่นที่นี่
dkaeae

โอเคฉันเห็นแล้ว แต่หนังสือตำราของฉันบอกสิ่งนี้: รหัส A ถอดรหัสได้ไม่เหมือนใครเพราะมันย้อนกลับเป็นรหัสนำหน้าฟรีดังนั้นคุณสามารถเข้าใจได้ว่ามันหมายถึงอะไรโดยย้อนกลับ?
2000 ผู้ส่ง

1
อาจเป็นเพียงรหัสที่ได้รับโดยการย้อนกลับ codewords ทั้งหมด
dkaeae

และทำไมมันถึงบอกว่าไม่สามารถถอดรหัสได้ฉันไม่ได้รับมัน
2000mroliver

1
cอาจเป็นคำนำหน้าbและf, แต่ส่วนต่อท้ายที่เหลืออยู่ไม่มีอยู่ในรหัส เมื่อคุณย้อนกลับรหัสส่วนต่อท้ายจะกลายเป็นคำนำหน้าและจากนั้นมันจะกลายเป็นคำนำหน้าฟรี
Barmar

คำตอบ:


26

รหัสของคุณมีคุณสมบัติที่ถ้าคุณย้อนกลับ codewords ทั้งหมดแล้วคุณจะได้รับรหัสคำนำหน้า นี่หมายความว่ารหัสของคุณสามารถถอดรหัสได้โดยไม่ซ้ำกัน

จริง ๆ ให้พิจารณารหัสซึ่งมีถอดรหัสได้ไม่ซ้ำกัน ฉันอ้างว่าสามารถถอดรหัสได้โดยเฉพาะ นี่เป็นเพราะ ในคำสลายตัวของเข้า codewords ของอยู่ในหนึ่งต่อหนึ่งการติดต่อกับการสลายตัวของเข้า codewords ของ R ตั้งแต่สมัยหลังนั้นมีความเป็นเอกลักษณ์C=x1,,xnCR:=x1R,,xnRC

w=xi1xim if and only if wR=ximRxi1R.
wCwRCR

เนื่องจากรหัสคำนำหน้านั้นสามารถถอดรหัสได้โดยไม่ซ้ำใครจึงเป็นไปได้ว่าการย้อนกลับของรหัสคำนำหน้านั้นยังสามารถถอดรหัสได้โดยไม่ซ้ำกัน นี่เป็นกรณีในตัวอย่างของคุณ

ความไม่เท่าเทียมกันของ McMillan ระบุว่าถ้าสามารถถอดรหัสได้โดยเฉพาะแล้ว กล่าวอีกอย่างหนึ่งคือรหัสที่ถอดรหัสไม่ซ้ำกันสอดคล้องกับความไม่เท่าเทียมของ Kraft ดังนั้นหากสิ่งที่คุณสนใจคือการลดความยาวรหัสที่คาดไว้ให้น้อยที่สุดก็ไม่มีเหตุผลที่จะดูเกินรหัสคำนำหน้าC

i=1n2|xi|1.

Sam Roweis แสดงตัวอย่างที่ดีของสไลด์โค้ดที่ไม่เหมือนใครซึ่งไม่ใช่รหัสนำหน้าหรือย้อนกลับของรหัสนำหน้า: เพื่อที่จะแสดงให้เห็นว่ารหัสนี้สามารถถอดรหัสได้โดยไม่ซ้ำกันมันพอเพียงที่จะแสดงวิธีการถอดรหัส codeword แรกของคำ หากคำเริ่มต้นด้วยแล้ว codeword แรกคือ110ถ้ามันเป็นของแบบฟอร์มแล้วมันต้องเป็นหรือ01มิฉะนั้นจะต้องมีคำนำหน้าของแบบฟอร์ม 0 ตอนนี้เราแยกแยะหลายกรณี:

0,01,110.
111001001010

prefix00010011001110codeword001001
อีกต่อไปไม่สามารถทำงานได้สามารถถอดรหัสได้ทั้งหมด1


2
ดูเหมือนว่าในตัวอย่างของ OP เราไม่สามารถถอดรหัส codeword แรกหลังจากจำนวนตัวเลขคงที่มีหลายกรณีอนันต์: 1001010101010101…สามารถเป็นได้ทั้งfcccccc…หรือcaaa…และเราอาจต้องรอจนกว่าจะสิ้นสุดการป้อนข้อมูลเพื่อตัดสินใจ
Bergi

1
นอกจากนี้ยังเกิดขึ้น1,10,001,10,00
Yuval Filmus

4
@ Bergi มันสามารถถอดรหัสได้เสมอสำหรับจำนวน จำกัด ใด ๆ ของตัวเลข มีเพียงวิธีเดียวเท่านั้นในการถอดรหัสการเข้ารหัสโดยไม่มีเศษ ความพยายามอื่น ๆ จะจบลงด้วยการสำรอง 1 หรือ 0 นี่เป็นเพราะรหัสนั้นสามารถถอดรหัสได้หากเราอ่านมันก่อน ในทางทฤษฎีหากสิ่งใดที่สามารถถอดรหัสได้ในทิศทางเดียวมันไม่สมเหตุสมผลเลยที่จะมีวิธีแก้ปัญหามากกว่าหนึ่งวิธีในทิศทางอื่น
slebetman

@slebetman ฉันหมายถึงคำนำหน้าแน่นอน (มีเศษเหลืออยู่) ใช่ถ้าเรารับข้อมูลทั้งหมดมันจะถอดรหัสได้เสมอ
Bergi

5

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

คุณสามารถทำได้เพราะหลังจากย้อนกลับคำหกคำคุณจะได้รับรหัสที่ไม่มีคำนำหน้า: 1010, 1001, 01, 000, 11, 001 ไม่มีคำนำหน้า


0

หากคำนำหน้าฟรีหมายถึงสิ่งที่ฉันคิดการย้อนกลับของ 'a' จะเริ่มต้นด้วย 1 หรือ 10 หรือ 101 ซึ่งไม่มีรหัสอื่นใดที่ถูกต้องทั้งหมด

ดังนั้นหากข้อความลงท้ายด้วย 0101 ข้อความนั้นจะต้องเป็น 'a' เท่านั้นและคุณสามารถใช้ตรรกะที่คล้ายกันกับบิตก่อนหน้านี้

อย่างไรก็ตามจะเกิดอะไรขึ้นถ้าไม่มีจุดจบที่จะเริ่มต้น ถ้าบิตแรกเป็น 1 คุณก็รู้ว่ามันไม่ใช่ 'a' หรือ 'd' บิตที่สองจะกำจัด 'e' หรือ {'b', 'c', 'f'} บิตที่สามอาจนำมาลงหนึ่งทางเลือก แต่ถ้าไม่มันเป็นบิตที่สี่โดยเฉพาะ

ทันทีที่คุณไปถึงลำดับที่ไม่ซ้ำกันคุณเริ่มต้นอัลกอริทึมในบิตถัดไป

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