รหัส Hamming (7,4) กลับไปที่ปี 1950 ก่อนหน้านั้น Richard Hamming ทำงานเป็นนักคณิตศาสตร์ที่ Bell Labs ทุกวันศุกร์ Hamming ตั้งค่าเครื่องคำนวณเพื่อทำการคำนวณแบบต่อเนื่องและรวบรวมผลลัพธ์ในวันจันทร์ถัดไป การใช้การตรวจสอบแบบพาริตี้ทำให้เครื่องเหล่านี้สามารถตรวจจับข้อผิดพลาดในระหว่างการคำนวณได้ ผิดหวังเพราะเขาได้รับข้อความแสดงข้อผิดพลาดบ่อยเกินไป Hamming ตัดสินใจปรับปรุงการตรวจจับข้อผิดพลาดและค้นพบรหัส Hamming ที่มีชื่อเสียง
กลไกของ Hamming (7,4)
เป้าหมายของรหัส Hamming คือการสร้างชุดของบิตพาริตี้ที่ทับซ้อนกันเช่นมีข้อผิดพลาดบิตเดียว (หนึ่งบิตพลิก) ในบิตข้อมูลหรือบิตพาริตี้สามารถตรวจพบและแก้ไขได้ เฉพาะในกรณีที่มีข้อผิดพลาดหลายอย่างรหัสแฮมมิงไม่สามารถกู้คืนข้อมูลดั้งเดิมได้ อาจไม่สังเกตเห็นข้อผิดพลาดเลยหรือแม้แต่แก้ไขให้ถูกต้อง ดังนั้นในความท้าทายนี้เราจะจัดการกับข้อผิดพลาดบิตเดียวเท่านั้น
ตัวอย่างของรหัส Hamming เราจะดูรหัส Hamming (7,4) นอกจากนี้ในข้อมูล 4 บิตd1, d2, d3, d4
จะใช้ 3 บิตพาริตีp1, p2, p3
ซึ่งคำนวณโดยใช้สมการต่อไปนี้:
p1 = (d1 + d2 + d4) % 2
p2 = (d1 + d3 + d4) % 2
p3 = (d2 + d3 + d4) % 2
codeword ที่เกิด (ข้อมูล + ความเท่าเทียมกันบิต) p1 p2 d1 p3 d2 d3 d4
จะอยู่ในรูป
การตรวจจับข้อผิดพลาดทำงานด้วยวิธีต่อไปนี้ คุณคำนวณบิตพาริตีอีกครั้งและตรวจสอบว่าตรงกับบิตแพริตีที่ได้รับ ในตารางต่อไปนี้คุณจะเห็นได้ว่าข้อผิดพลาดทุกบิตเดียวให้ผลการจับคู่ที่แตกต่างกันของบิตพาริตี้ ดังนั้นทุกข้อผิดพลาดบิตเดียวสามารถแปลและแก้ไข
error in bit | p1 | p2 | d1 | p3 | d2 | d3 | d4 | no error
-------------|---------------------------------------------
p1 matches | no | yes| no | yes| no | yes| no | yes
p2 matches | yes| no | no | yes| yes| no | no | yes
p3 matches | yes| yes| yes| no | no | no | no | yes
ตัวอย่าง
1011
ให้ข้อมูลของคุณจะ บิตเท่าเทียมกันมีp1 = 1 + 0 + 1 = 0
, และp2 = 1 + 1 + 1 = 1
p3 = 0 + 1 + 1 = 0
รวมข้อมูลและความเท่าเทียมกันบิตและคุณได้รับ 0110011
codeword
data bits | 1 011
parity bits | 01 0
--------------------
codeword | 0110011
ให้พูดระหว่างการส่งหรือการคำนวณบิตที่ 6 (= บิตที่ 3 ข้อมูล) พลิก 0110001
คุณได้รับคำ 1001
ข้อมูลที่ได้รับการกล่าวหาว่าเป็น คุณคำนวณบิตเท่าเทียมกันอีกครั้งp1 = 1 + 0 + 1 = 0
, ,p2 = 1 + 0 + 1 = 0
p3 = 0 + 0 + 1 = 1
เฉพาะp1
ตรงกับความเท่าเทียมกันของบิต 0110001
codeword ดังนั้นจึงเกิดข้อผิดพลาด ดูตารางข้างต้นบอกเราว่ามีข้อผิดพลาดเกิดขึ้นd3
และคุณสามารถกู้คืนข้อมูลต้นฉบับ1011
ได้
ท้าทาย:
เขียนฟังก์ชั่นหรือโปรแกรมที่ได้รับคำ (7 บิต) หนึ่งในบิตอาจผิดและกู้คืนข้อมูลต้นฉบับ การป้อนข้อมูล (ผ่าน STDIN อาร์กิวเมนต์บรรทัดคำสั่งแจ้งหรือฟังก์ชั่นการโต้แย้ง) รูปแบบอาจจะเป็นสตริง"0110001"
, รายการหรืออาร์เรย์[0, 1, 1, 0, 0, 0, 1]
หรือจำนวนเต็มใน 0b0110001 = 49
MSB p1 p2 d1 p3 d2 d3 d4
ตามที่อธิบายไว้ข้างต้นคำสั่งของการป้อนข้อมูลที่เป็น เอาท์พุท (ผ่านค่าตอบแทนหรือ STDOUT) จะต้องมีรูปแบบเดียวกัน d1 d2 d3 d4
แต่ในการสั่งซื้อ ส่งคืน / ส่งออกข้อมูล 4 บิตเท่านั้น
นี่คือรหัสกอล์ฟ ดังนั้นรหัสที่สั้นที่สุดชนะ
กรณีทดสอบ:
1110000 -> 1000 # no error
1100000 -> 1000 # error at 1st data bit
1111011 -> 1111 # error at 2nd data bit
0110001 -> 1011 # error at 3rd data bit (example)
1011011 -> 1010 # error at 4th data bit
0101001 -> 0001 # error at 1st parity bit
1010000 -> 1000 # error at 2nd parity bit
0100010 -> 0010 # error at 3rd parity bit
[is_p3_wrong][is_p2_wrong][is_p1_wrong]
ในฐานสองมันจะให้ตำแหน่งของบิตที่ไม่ถูกต้องในคำว่า (ขึ้นอยู่กับตารางในคำถาม) ซึ่งอาจเป็นประโยชน์สำหรับอัลกอริทึมบางอย่าง