হামিং (,,৪) কোডটি ১৯৫০-এ ফিরে যায় then এর আগে রিচার্ড হামিং বেল ল্যাবসে গণিতবিদ হিসাবে কাজ করেছিলেন। প্রতি শুক্রবার হামিং ধারাবাহিক গণনা করার জন্য গণনা মেশিনগুলি সেট করে এবং নিম্নলিখিত সোমবারে ফলাফল সংগ্রহ করে। প্যারিটি চেক ব্যবহার করে, এই মেশিনগুলি গণনার সময় ত্রুটিগুলি সনাক্ত করতে সক্ষম হয়েছিল। হতাশ, কারণ তিনি প্রায়ই বার বার ত্রুটি বার্তা পেয়েছিলেন, হামিং ত্রুটি সনাক্তকরণটি উন্নত করার সিদ্ধান্ত নিয়েছে এবং বিখ্যাত হামিং কোডগুলি আবিষ্কার করেছে।
হামিংয়ের মেকানিক্স (7,4)
হামিং কোডগুলির লক্ষ্য হ'ল প্যারিটি বিটগুলির একটি সেট তৈরি করা যা ওভারল্যাপ করে এমন যে একটি ডেটা বিটের মধ্যে একটি একক-বিট ত্রুটি (এক বিট উল্টানো হয়) বা একটি প্যারিটি বিট সনাক্ত এবং সংশোধন করা যায়। শুধুমাত্র যদি একাধিক ত্রুটি ঘটে তবে হামিং কোডটি মূল ডেটা পুনরুদ্ধারে ব্যর্থ হয়। এটি কোনও ত্রুটি একেবারেই লক্ষ্য করতে পারে না, এমনকি এটি মিথ্যাভাবেও সংশোধন করতে পারে। সুতরাং এই চ্যালেঞ্জে আমরা কেবল একক-বিট ত্রুটিগুলি নিয়ে কাজ করব।
হামিং কোডগুলির উদাহরণ হিসাবে, আমরা হামিং (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
ফলাফলযুক্ত কোডওয়ার্ড (ডেটা + প্যারিটি বিট) ফর্মের 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
।
data bits | 1 011
parity bits | 01 0
--------------------
codeword | 0110011
ট্রান্সমিশন বা একটি গণনার সময় 6th ষ্ঠ বিট (= ২ য় ডেটা বিট) ফ্লিপ করতে দেয়। আপনি শব্দটি গ্রহণ করুন 0110001
। কথিত প্রাপ্ত তথ্য হ'ল 1001
। আপনি প্যারিটি বিট আবার নিরূপণ p1 = 1 + 0 + 1 = 0
, p2 = 1 + 0 + 1 = 0
, p3 = 0 + 0 + 1 = 1
। কেবল p1
কোডওয়ার্ডের প্যারিটি বিটের সাথে মেলে 0110001
। সুতরাং একটি ত্রুটি ঘটেছে। উপরের টেবিলটির দিকে তাকিয়ে আমাদের জানান যে ত্রুটিটি ঘটেছে d3
এবং আপনি মূল তথ্যটি পুনরুদ্ধার করতে পারেন 1011
।
চ্যালেঞ্জ:
একটি ফাংশন বা একটি প্রোগ্রাম লিখুন, এটি একটি শব্দ (7 বিট) গ্রহণ করে, বিটগুলির মধ্যে একটিও ভুল হতে পারে এবং আসল তথ্যটি পুনরুদ্ধার করে। ইনপুট (এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, প্রম্পট বা ফাংশন আর্গুমেন্টের মাধ্যমে) ফর্ম্যাটটি স্ট্রিং "0110001"
, একটি তালিকা বা অ্যারে [0, 1, 1, 0, 0, 0, 1]
বা এমএসবিতে একটি পূর্ণসংখ্যা হতে পারে 0b0110001 = 49
। উপরে বর্ণিত হিসাবে, ইনপুট ক্রম হয় 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]
বেস দুইটি নেন তবে এটি শব্দের মধ্যে ভুল বিটের অবস্থান দেয়। (প্রশ্নের টেবিলের উপর ভিত্তি করে)) এটি সম্ভবত কিছু অ্যালগরিদমের জন্য কার্যকর হবে।