Kode Hamming (7,4) kembali ke tahun 1950. Saat itu Richard Hamming bekerja sebagai ahli matematika di Bell Labs. Setiap Jumat, Hamming mengatur mesin penghitung untuk melakukan serangkaian perhitungan, dan mengumpulkan hasilnya pada hari Senin berikutnya. Menggunakan pemeriksaan paritas, mesin-mesin ini dapat mendeteksi kesalahan selama perhitungan. Frustrasi, karena terlalu sering menerima pesan kesalahan, Hamming memutuskan untuk meningkatkan deteksi kesalahan dan menemukan kode Hamming yang terkenal.
Mekanika Hamming (7,4)
Tujuan dari kode Hamming adalah untuk membuat satu set bit paritas yang tumpang tindih sehingga kesalahan bit tunggal (satu bit dibalik) dalam bit data atau bit paritas dapat dideteksi dan diperbaiki. Hanya jika ada beberapa kesalahan, kode Hamming gagal memulihkan data asli. Mungkin tidak melihat kesalahan sama sekali, atau bahkan memperbaikinya dengan salah. Karenanya dalam tantangan ini kita hanya akan berurusan dengan kesalahan bit-tunggal.
Sebagai contoh kode Hamming, kita akan melihat kode Hamming (7,4). Selain itu untuk 4 bit data d1, d2, d3, d4
menggunakan 3 bit paritas p1, p2, p3
, yang dihitung menggunakan persamaan berikut:
p1 = (d1 + d2 + d4) % 2
p2 = (d1 + d3 + d4) % 2
p3 = (d2 + d3 + d4) % 2
Codeword yang dihasilkan (bit data + paritas) berbentuk form p1 p2 d1 p3 d2 d3 d4
.
Mendeteksi kesalahan berfungsi sebagai berikut. Anda menghitung ulang bit paritas, dan memeriksa apakah cocok dengan bit paritas yang diterima. Dalam tabel berikut, Anda dapat melihat, bahwa setiap variasi kesalahan bit tunggal menghasilkan pencocokan yang berbeda dari bit paritas. Oleh karena itu setiap kesalahan bit tunggal dapat dilokalkan dan diperbaiki.
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
Contoh
Biarkan data Anda 1011
. Bit paritas adalah p1 = 1 + 0 + 1 = 0
, p2 = 1 + 1 + 1 = 1
dan p3 = 0 + 1 + 1 = 0
. Gabungkan data dan bit paritas dan Anda mendapatkan kata sandi 0110011
.
data bits | 1 011
parity bits | 01 0
--------------------
codeword | 0110011
Katakanlah selama transmisi atau perhitungan bit ke-6 (= bit data ke-3) terbalik. Anda menerima kata itu 0110001
. Data yang diterima diduga adalah 1001
. Anda menghitung paritas bit lagi p1 = 1 + 0 + 1 = 0
, p2 = 1 + 0 + 1 = 0
, p3 = 0 + 0 + 1 = 1
. Hanya p1
cocok dengan bit paritas codeword 0110001
. Karenanya terjadi kesalahan. Melihat tabel di atas, memberi tahu kami bahwa kesalahan terjadi d3
dan Anda dapat memulihkan data asli 1011
.
Tantangan:
Tulis fungsi atau program, yang menerima kata (7 bit), salah satu bit mungkin salah, dan pulihkan data aslinya. Format input (melalui STDIN, argumen baris perintah, argumen cepat atau fungsi) dapat berupa string "0110001"
, daftar atau array [0, 1, 1, 0, 0, 0, 1]
atau integer di MSB 0b0110001 = 49
. Seperti dijelaskan di atas, urutan input adalah p1 p2 d1 p3 d2 d3 d4
. Output (melalui nilai balik atau STDOUT) harus dalam format yang sama, tetapi dalam urutand1 d2 d3 d4
. Hanya kembalikan / hasilkan 4 bit data.
Ini adalah kode-golf. Karenanya kode terpendek menang.
Kasus uji:
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]
di basis dua itu memberikan posisi bit yang salah dalam kata. (Berdasarkan tabel pada pertanyaan.) Ini mungkin akan berguna untuk beberapa algoritma.