Tuesday, February 17, 2009

যন্ত্র গণকের যন্তর মন্তর - ২

করিম সাহেবের জাম্বুরা কেনা

করিম সাহেব বাজারে গিয়েছেন জাম্বুরা কিনতে। দোকানী এক গাদা জাম্বুরা সাজিয়ে বসে আছে, সবগুলো দেখতে একই আকারের লাগছে। কিন্তু জাম্বুরা কিনে কিনে চুল পাকানো করিম সাহেব ভালো করেই জানেন, জাম্বুরা যত ভারী হবে, ততো তার স্বাদ ভালো, মজা বেশি।

প্রশ্ন হলো, করিম সাহেব কী করে একগাদা জাম্বুরা থেকে সবচেয়ে ভারীটি বের করবেন।


পাঠ ২

কম্পিউটার প্রোগ্রামিং এ এরকম সমস্যা প্রায়ই আসে, একটা তালিকা থেকে সবচেয়ে বেশি বা কম বা এরকম কিছু একটাকে খুঁজে বের করতে হবে। ধরা যাক, ১০০টা সংখ্যা দেয়া আছে, তার থেকে সবচেয়ে বড় সংখ্যাটা বের করতে হবে।

বিশাল সমস্যা! বেকুব কম্পিউটারকে পুরাটা একবারে দিলে লেজে-গোবরে করে ফেলবে। আসুন, প্রথমে সমস্যাটাকে ছোট করে ফেলি।


১টা যদি সংখ্যা হয়, তাহলে তো আর ঝামেলা নাই। যেটা আছে, সেটাই সবচেয়ে বড়। কাজ শেষ।

২টা যদি সংখ্যা হয়, তাহলে তাদের তুলনা করলেই পাবো কোনটা বড়। সংখ্যা দুইটা ডানহাত ও বামহাত – এই দুই জায়গায় নিয়ে বুঝতে পারি কোনটা বড়। করিম সাহেবের সমস্যায় যদি ফেরত যাই, তাহলে করিম সাহেব দুইটা জাম্বুরা দুই হাতে নিয়ে বুঝতে পারবেন সহজেই কোনটা ভারি।


এখন যদি দুই এর বেশি হয়, ধরা যাক ৩টা, তাহলে? সেটাও সহজ, প্রথমে করিম সাহেব প্রথম দুইটা জাম্বুরা দুই হাতে নিলেন, ধরা যাক ডান হাতেরটা ভারি। তখন বাম হাতেরটা ফেলে ৩য় জাম্বুরাটা বাম হাতে নিলেন, দেখতে চেষ্টা করলেন কোনটা ভারি। ডান হাতে আছে প্রথম দুইটার মধ্যের ভারিটা, আর বাম হাতে অন্যটা, এর মধ্যে যেইটা ভারি হবে, সেটাই ৩টা জাম্বুরার সবচেয়ে ভারিটা।

এই কাজটাকে একটু সাংকেতিক ভাবে এভাবে লেখা যায়, ধরাযাক সংখ্যাগুলো আছে x, y, z এই তিনটা নামে,

যদি X ও Y এর মধ্যে x বড় হয়, তাহলে x ও z এর মধ্যে যেটা বড়, সেটাই বৃহত্তম,

অন্যথায় যদি

X ও Y এর মধ্যে Y বড় হয়, তাহলে y ও z এর মধ্যে যেটা বড়, সেটাই বৃহত্তম।

এই কথাটাই যেকোনো প্রোগ্রামিং ভাষায় লেখা যায়, যেমন ধরুন C ভাষায় লেখা যায় –


if (x>y) { // যদি
if (x>z) largest = x

else largest = z;

} else {

if (y>z) largest = y;

else largest = z;

}

দুর্বোধ্য লাগছে? আসলেই ... এই জিনিষটাকে আরো সংক্ষেপে খুব সহজেই লিখতে পারি এইভাবে -


if x>y largest = x else largest =y;

if z>largest then largest = z;


মানে তিনটা সংখ্যার প্রথম দুইটার মধ্যে বড় যেটা, সেটার সাথে পরেরটার তুলনা করে যেটাকে বড় পাবো, সেটাই সবচেয়ে বড়।

আচ্ছা, ৩টা সংখ্যার মধ্যে না হয় এই দুই লাইনে বের করা গেলো বড় সংখ্যাটি। কিন্তু যদি ৩টার যায়গায় ৩০০ বা ১কোটি সংখ্যা থাকে? করিম সাহেবের কথাই ধরা যাক, ঝুড়িতে যদি ৫০টি জাম্বুরা থাকে, তাহলে কী করবেন তিনি?

মূলনীতিটা কিন্তু একই থাকছে, কাজেই এভাবে আগানো যেতে পারে,

শুরুতে কোনটা ভারী, তা করিম সাহেব জানেননা, তাই তিনি আন্দাজে একটা বেছে নিয়ে ধরলেন সেইটাই সবচেয়ে ভারী। ঐ জাম্বুরাটাকে নিয়ে রাখলেন ডানহাতে।

এবার ঝুড়ি থেকে একটা একটা জাম্বুরা বাম হাতে নেন, আর দেখেন ডান হাতেরটার চেয়ে এই নতুনটা ভারী কি না।

যদি ভারী হয়, তাহলে কথাই নেই, ডান হাতেরটাকে অন্য কোথাও রেখে দিয়ে ডান হাতে পাচার করে দেন বা হাত থেকে নতুন ভারী জাম্বুরাটি।

এভাবে একটা একটা করে ঝুড়ির সবগুলো দেখা হয়ে গেলে সব শেষে করিম সাহেবের ডান হাতে যা থাকছে, সেটাই ঝুড়ির সবচেয়ে ভারী জাম্বুরা।


এবার বেকুব কম্পিউটারকে এরকম ব্যাপার কীভাবে সাংকেতিক উপায়ে বোঝানো যায়, তার একটা রূপরেখা দেখা যাক। ধরাযাক, ১০০টি জাম্বুরা আছে, যাদের নম্বর দেয়া হলো ০ থেকে ৯৯ পর্যন্ত (কম্পিউটার বিজ্ঞানীরা আবার ০ থেকে গোণা শুরু করে)। আর জাম্বুরা গুলোর ওজন ধরা যাক আছে weight[0] থেকে weight[99] এভাবে।

আমাদের কাজ হবে বেকুব কম্পিউটারকে বোঝানো, ১০০টি জিনিষের মধ্যে সবচেয়ে ভারী কোনটা, সেটার ক্রমিক নম্বরটি আমাদের জানানোর কৌশল।

শুরুতে, ধরে নেই প্রথমটি সবচেয়ে ভারী।

heaviest = 0 ; (প্রথমটির ক্রমিক নং হলো ০ )

আর সবচেয়ে ভারী জাম্বুরাটির ওজন আমরা মনে রাখবো max_weight নামে, প্রথমে যেহেতু ধরেছি শুরুর জাম্বুরার ওজন বেশি, তাই সেটার ওজনকেই এখানে মনে রাখি।

max_weight = weight[0];

এবার এক এক করে বাকি গুলোকে পরীক্ষা করি, দেখি এই max_weight এর বেশি পাই কি না

(আমরা একটা একটা করে না লিখে বেকুব কম্পিউটার যেইটা ভালো পারে, সেই পুনরাবৃত্তি তথা লুপের মাধ্যমে করা যায়। সংখ্যা যেহেতু ১০০টি, কাজেই আমাদের অত বার মাপামাপির কাজ করলেই চলবে। এই জন্য কম্পিউটারকে নির্দেশ দেয়া যাক, ১০০ বার সে একটা করে ওজন তুলুক, তার পর দেখুক এইটা আগের চেয়ে ভারী কি না)


for (i = 1; i<100;> এখন কোনটা নিয়ে কাজ করা হচ্ছে, তা i এর মধ্যে রাখবো, আর প্রতি বার লুপের ভিতরের কাজ শেষ হলে ১ করে বাড়াবো। প্রথমটা (০তম) তো দেখেই ফেলেছি, তাই এখন দ্বিতীয়টা, মানে ক্রমিক নং ১থেকে ৯৯ পর্যন্ত বাকি ৯৯টা নিয়ে দেখলেই চলবে)
if (weight[i]>max_weight){ // আগের ওজনদার-তম জাম্বুরার চাইতে এই নতুনটা ভারী কি?
heaviest = i;
max_weight=weight[i]

}
(তাহলে এই নতুনটাই সবচেয়ে ভারী)
(ঐটার ওজনটা মনে রেখে দিলাম)

ব্যস, এই কাজটুকু শেষ ওজন পর্যন্ত করে গেলেই সব শেষে heaviest এর মধ্যে পাবো সবচে ভারী জাম্বুরাটির ক্রমিক নম্বর, আর তার ওজন পাবো max_weight এর মধ্যে।

---

সুতরাং, আজকের পাঠে আমরা দেখতে পেলাম, ভারী হালকা বের করার কাজটা আমরা সুকৌশলে বেকুব কম্পিউটারের ঘাড়ে গছিয়ে দিতে পারি, যাতে করে আমরা নাকে তেল দিয়ে আরামে ঘুমোতে পারি, আর করিম সাহেবও জাম্বুরা কেনায় বিশাল দাওটি মারতে পারেন।

No comments: