করিম সাহেবের জাম্বুরা কেনা |
|
করিম সাহেব বাজারে গিয়েছেন জাম্বুরা কিনতে। দোকানী এক গাদা জাম্বুরা সাজিয়ে বসে আছে, সবগুলো দেখতে একই আকারের লাগছে। কিন্তু জাম্বুরা কিনে কিনে চুল পাকানো করিম সাহেব ভালো করেই জানেন, জাম্বুরা যত ভারী হবে, ততো তার স্বাদ ভালো, মজা বেশি। প্রশ্ন হলো, করিম সাহেব কী করে একগাদা জাম্বুরা থেকে সবচেয়ে ভারীটি বের করবেন। |
কম্পিউটার প্রোগ্রামিং এ এরকম সমস্যা প্রায়ই আসে, একটা তালিকা থেকে সবচেয়ে বেশি বা কম বা এরকম কিছু একটাকে খুঁজে বের করতে হবে। ধরা যাক, ১০০টা সংখ্যা দেয়া আছে, তার থেকে সবচেয়ে বড় সংখ্যাটা বের করতে হবে।
বিশাল সমস্যা! বেকুব কম্পিউটারকে পুরাটা একবারে দিলে লেজে-গোবরে করে ফেলবে। আসুন, প্রথমে সমস্যাটাকে ছোট করে ফেলি।
১টা যদি সংখ্যা হয়, তাহলে তো আর ঝামেলা নাই। যেটা আছে, সেটাই সবচেয়ে বড়। কাজ শেষ।
২টা যদি সংখ্যা হয়, তাহলে তাদের তুলনা করলেই পাবো কোনটা বড়। সংখ্যা দুইটা ডানহাত ও বামহাত – এই দুই জায়গায় নিয়ে বুঝতে পারি কোনটা বড়। করিম সাহেবের সমস্যায় যদি ফেরত যাই, তাহলে করিম সাহেব দুইটা জাম্বুরা দুই হাতে নিয়ে বুঝতে পারবেন সহজেই কোনটা ভারি।
এখন যদি দুই এর বেশি হয়, ধরা যাক ৩টা, তাহলে? সেটাও সহজ, প্রথমে করিম সাহেব প্রথম দুইটা জাম্বুরা দুই হাতে নিলেন, ধরা যাক ডান হাতেরটা ভারি। তখন বাম হাতেরটা ফেলে ৩য় জাম্বুরাটা বাম হাতে নিলেন, দেখতে চেষ্টা করলেন কোনটা ভারি। ডান হাতে আছে প্রথম দুইটার মধ্যের ভারিটা, আর বাম হাতে অন্যটা, এর মধ্যে যেইটা ভারি হবে, সেটাই ৩টা জাম্বুরার সবচেয়ে ভারিটা।
এই কাজটাকে একটু সাংকেতিক ভাবে এভাবে লেখা যায়, ধরাযাক সংখ্যাগুলো আছে 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++) { | এখন কোনটা নিয়ে কাজ করা হচ্ছে, তা i এর মধ্যে রাখবো, আর প্রতি বার লুপের ভিতরের কাজ শেষ হলে ১ করে বাড়াবো। প্রথমটা (০তম) তো দেখেই ফেলেছি, তাই এখন দ্বিতীয়টা, মানে ক্রমিক নং ১থেকে ৯৯ পর্যন্ত বাকি ৯৯টা নিয়ে দেখলেই চলবে)
|
if (weight[i]>max_weight){ | // আগের ওজনদার-তম জাম্বুরার চাইতে এই নতুনটা ভারী কি? |
heaviest = i; max_weight=weight[i] } |
(তাহলে এই নতুনটাই সবচেয়ে ভারী) (ঐটার ওজনটা মনে রেখে দিলাম) |
ব্যস, এই কাজটুকু শেষ ওজন পর্যন্ত করে গেলেই সব শেষে heaviest এর মধ্যে পাবো সবচে ভারী জাম্বুরাটির ক্রমিক নম্বর, আর তার ওজন পাবো max_weight এর মধ্যে।
---
সুতরাং, আজকের পাঠে আমরা দেখতে পেলাম, ভারী হালকা বের করার কাজটা আমরা সুকৌশলে বেকুব কম্পিউটারের ঘাড়ে গছিয়ে দিতে পারি, যাতে করে আমরা নাকে তেল দিয়ে আরামে ঘুমোতে পারি, আর করিম সাহেবও জাম্বুরা কেনায় বিশাল দাওটি মারতে পারেন।
মন্তব্য
ভালো করেছেন, অনেক মজা
আপনার ক্লাশ পাই নি কখনো, এখন আফসোস হচ্ছে
রাগিব ভাই, খুব ভাল হচ্ছে!!!
দারুন হচ্ছে রাগিব ভাই, এরপর কি সর্ট ?
অনেক দূরে যাব
যেখানে আকাশ লাল, মাটিটা ধূসর নীল ...
অনেক দূরে যাব
যেখানে আকাশ লাল, মাটিটা ধূসর নীল ...
বই হতেই হবে। প্রয়োজনে চাঁদা তুলে পাহারাদার নিয়োগ করবো এটা নিশ্চিত করতে।
জটিল বিষয় গভীর ভাবে বুঝতে পারার একমাত্র লক্ষণ হল তা সহজ ভাষায় অন্যকে বোঝাতে পারা।
এই প্রাঞ্জলতা দেখে আপনার লেখক সত্বাকে প্রশংসা করলে সেই মন্তব্য অপূর্ণ থেকে যাবে।
সিরিজ চলুক।
আহা ! আজি হতে পাঁচ বৎসর পূর্বে যদি আপনার এই লেখা পড়িতে পাইতাম !
বিদেশি ভাষায় হার্বাট শিল্ডের বই পড়িয়া, বহু কাঠ খড় পোড়াইয়া তবে শিখিয়াছি এই বিদ্যা !
লেখায় । বইয়ের দাবী রইলো আমারও।
অলমিতি বিস্তারেণ
অলমিতি বিস্তারেণ
ভাল হচ্ছে। প্রোগ্রামিং শেখার জন্য অতি ধীর গতির কম্পিউটারের প্রয়োজনীয়তা উপলব্ধি করেছিলাম।
ঘটনা:
শেষতক তৎকালীন কম্পিউটার সেন্টারের টার্মিনালে আমার এলগরিদমটি চোথার এলগরিদমের চেয়ে বেশি কার্যকর প্রমাণিত হলো -- এখনকার কম্পিউটারে সেটি অবশ্য বুঝবার উপায় নাই। কারণ টার্মিনালের ০৮৬ (!!) ইঞ্জিনের ২ এবং ১০ সেকেন্ডের পার্থক্য মানুষ বুঝতে পারলেও অধুনা মেশিনের ২ এবং ১০ মিলি সেকেন্ডের পার্থক্য বোঝে কার সাধ্য। ----- (ঐটা ছিল মৌলিক সংখ্যা বের করার প্রোগ্রাম। চোথায় নিরীক্ষা ভাজ্য'র লুপ ছিল 2 থেকে x/2 পর্যন্ত; আর আমার লুপ ছিল 2 থেকে integer(sqrt(x)) পর্যন্ত)
________________________________
সমস্যা জীবনের অবিচ্ছেদ্য অংশ; পালিয়ে লাভ নাই।
________________________________
সমস্যা জীবনের অবিচ্ছেদ্য অংশ; পালিয়ে লাভ নাই।
"2 থেকে integer(sqrt(x))" রে রিকার্সিভের প্যাঁচে ফেইলা আরো স্পীডি করা যায় মনে হচ্ছে
========================
যার ঘড়ি সে তৈয়ার করে,ঘড়ির ভিতর লুকাইছে
========================
যার ঘড়ি সে তৈয়ার করে,ঘড়ির ভিতর লুকাইছে
এরাটস্থেনিসের ছাঁকনিটাও খুব ভাল । বিশাল বিশাল মৌলিক সংখ্যা বেরিয়ে আসে খুব তাড়াতাড়ি ।
অনেক দূরে যাব
যেখানে আকাশ লাল, মাটিটা ধূসর নীল ...
অনেক দূরে যাব
যেখানে আকাশ লাল, মাটিটা ধূসর নীল ...
অসাধারণ
খুব ভাল হচ্ছে।
খুবই ভাল লাগছে। আপনার মতো মাস্টার পেলে এই বিদ্যাই আয়ত্ব করার চেষ্টা করতাম। চমৎকার!
_____________________________
যতদূর গেলে পলায়ন হয়, ততদূর কেউ আর পারেনা যেতে।
_____________________________
যতদূর গেলে পলায়ন হয়, ততদূর কেউ আর পারেনা যেতে।
ওরে বাবা, একজন হিব্রু ভাষায় লেখে তো আরেকজন ঈদ্দিশ ভাষায় তার কমেন্ট করে। এইটা যে আমার জিনিস না, তা পরিষ্কার বোঝা গেছে। আরো বোঝা গেছে যে, এত প্রাঞ্জল ভাষায় লেখার আগে বিষয়টা কত প্রাঞ্জলভাবে আপনাকে বুঝতে হয়েছে। অভিবাদন।
.......................................................................................
আমি অপার হয়ে বসে আছি...
.......................................................................................
Simply joking around...
অসাধারণ একটা বই হবে সহজ এবং বাংলা ভাষায়
(যদিও আমার কোনো কাজে লাগবে না)
করে ফেলেন
তবে এই পোস্টের শুরুর মতো নীল ব্যাকগ্রাউন্ডে কালো অক্ষর দিয়েন না
চোখ টনটন করে
০২
পৃথিবীর সবকিছুকে সংখ্যায় রূপান্তর করে কম্পুর মাথায় ঢোকানো যায় একটা শুনেছি বহুবার
কিন্তু কম্পুর হিজিবিজিকেও যে গল্পে রূপান্তর করা যায় এটা এই প্রথম জানলাম
অসাধারণ, রাগিব ভাই, অসাধারণ। এত সহজ করে বুঝিয়ে দিচ্ছেন, ভবিষ্যতের প্রোগ্রামিং চ্যাম্পিয়নদের পাথেয় হয়ে থাক এ লেখা। আপনাকে অশেষ শ্রদ্ধা।
-----------------------------------------------------------------
কাচের জগে, বালতি-মগে, চায়ের কাপে ছাই,
অন্ধকারে ভূতের কোরাস, “মুন্ডু কেটে খাই” ।
-----------------------------------------------------------------
কাচের জগে, বালতি-মগে, চায়ের কাপে ছাই,
অন্ধকারে ভূতের কোরাস, “মুন্ডু কেটে খাই” ।
খুব ভাল হচ্ছে। মজার কথা হচ্ছে যে আমার ছোট বোন এবার কম্পিউটার বিভাগে ক্লাস শুরু করবে। আমি তোমার লিখা গুলো সোজা তাকে পাঠিয়ে দিচ্ছি। অনেক ধন্যবাদ।
আর একটা জিনিস দরকার বলে মনে হচ্ছে আমার কাছে, তা হলো কিভাবে কোড গুলো কম্পাইল করবে তার একটা সহজ বিবরন শুরুতে দিলে ভাল হয়। ধন্যবাদ।
রাগিব ভাই ভালো হইতেসে... হার্বার্ট শিল্ডের কাছে আমিও ঋণী... আমাদের প্রোগ্রামিঙ্গের জাঁদরেল স্যারের হাতে ফেল করা থেকে বাঁচানোর জন্য...
_______________
এক ছাগলের দুই কান,
তুই আমার জানের জান।
_______________
::সহজ উবুন্টু শিক্ষা::
সুন্দর, খুবই সুন্দর। সবচেয়ে মজা পেয়েছি এই লাইনে
কিন্তু স্যার, কিছু প্রোগ্রাম আছে (যেমন R) যারা ফর-টাইপ লুপে দুর্বল। ভেক্টর বা ম্যাট্রিক্স হলে দ্রুত কাজ করতে পারে। যেহেতু আপনার সিরিজটা আ্যলগরিদমের, তাই বলছিলাম, অল্টারনেটিভ একটা এ্যলগরিদম নিয়ে খানিকটা আলোকপাত করবেন কি?
সেইসাথে আরেকখান আবদার। প্রোগ্রামিংয়ের সাথে কম্পিউটারের মেমোরির একটা সম্পর্ক কোনএককালে আবিষ্কার করেছিলাম। যেটা করতে পারিনি তা হলো ২^২৯ বা তার বেশী দৈর্ঘের ভেক্টর তৈরি করতে। ২^২৮ পর্যন্ত নেয়, এর বেশী হলেই এরর দেখায়। একটু ঘাটাঘাটি করে যা বুঝেছিলাম ৩২বিট বা এজাতীয় (দুর্বোধ্য কিছু) ব্যাপার স্যাপার আছে। এসব নিয়ে সরলীকৃত কোনএকটা পোস্ট যদি দেন তাহলে খুব ভালো হবে।
রাগিব ভাই আমার ইচ্ছা করছে আবার নতুন করে শুরু করি। আপনার ছাত্র হয়ে গেলাম কিন্তু। আপনি যদি এই সিরিজটা প্রযুয়ক্তি ফোরামেও পোস্ট করে তাহলে ভালো হতো অথবা আপনার অনুমতি নিয়ে আমি ঐখানে পোস্ট করতে পারি।
ধন্যবাদ
গুগল করলেই যেখানে সব পাওয়া যায় কিংবা লিংক ক্লীক করলেই যেখানে সোর্স ওয়েবসাইট আসা যায় সেখানে একই পোস্ট হাজার জায়গায় পোস্ট করার কি কারন থাকতে পারে আমি বুঝিনা!!!
====
চিত্ত থাকুক সমুন্নত, উচ্চ থাকুক শির
১০টা : প্রথমটা এ ধরনের সিরিজ লেখার জন্য, দ্বিতীয়টা ফরম্যাটিংএর জন্য যে সময় ব্যয় করেছেন তার জন্য
আপনার লেখা দেখে অনেক আগে রবার্ট ল্যাফোর এর সি++ বইয়ের কথা মনে পড়ছে। প্রোগ্রামিং এর উপর যে কয়টি বই পড়েছি তাতে রবার্ট ল্যাফোর এর স্টাইলটি আমার বেশ ভাল লেগেছে। প্রত্যেকটি বিষয়ের গ্রাফিক্যাল রিপ্রেজেন্টেশন লেখক শুরুতেই উপস্থাপন করে বিস্তারিত আলোচনা করেছেন। আপনার স্টাইলটা অনেকটা সেরকম। আপনাকে ধন্যবাদ এ রকম লেখার জন্য। আমাদের দেশের লেখকগন প্রচলিত ধারা থেকে বের হয়ে আসতে পারেন খুব কম ক্ষেত্রেই। কারন কি জানি না।
আপনার লেখাটি যদি সি++ এর উপর ভিত্তি করে লিখে বই আকারে বের হয় তাহলে খুব চমৎকার হত কারন এটি এখন একটি বহুল ব্যবহৃত সিস্টেম লেভেল ল্যাঙ্গুয়েজ। সবশেষে আপনার সফলতা কামনা করে শেষ করছি।
ভালো লাগলো । কিছু প্রশ্ন :
১। প্রোগ্রামিং/coding-এর জন্য best practice জাতীয় কোনো বই / guideline আছে কি ?
২। কিছু সিনিয়র ভাইদের দেখেছি খুব compact কোড লিখতে। বেসিক প্রোগ্রামিং-এর বই পড়ার পর style improve করার জন্য কি ধরনের বই পড়া যেতে পারে ? প্রশ্নগুলো c/c++ মাথায় রেখে করা ।
নতুন মন্তব্য করুন