Algorithm Information

অ্যালগরিদম


ছোটবেলায় যখন Algorithm শব্দটা প্রথম শুনেছিলাম, ধরেই নিয়েছিলাম যে এটি Algebra এর সাথে সম্পর্কিত কিছু একটা হবে। কোন এক সেন্সে হয়ত হতেও পারে। কিন্তু সেটি নিয়ে ভাবতে চাচ্ছিনা। যা চাচ্ছি তা হল এই অভিজাত ভাব সম্পন্ন একটি শব্দ Algorithm কি তা বুঝতে এবং Programming এর সাথে এর সম্পর্কটাই বা কি? 

তো "Algorithm হচ্ছে মূলত কিছু series of steps বা ধাপে ধাপে কিছু করা"। হ্যা, এটুকুই! আপনার আমার কাছে ব্যাপারটা প্রথম শুনলে খুবি সহজ মনে হলেও হতে পারে এবং এইটাই হল সেই ভুলটা যেটা আমাদের "Programming" বা Algorithm সহজে লিখতে বা বুঝতে দেয় না। আমরা এই "সহজ" ব্যাপারটার সাথে এতটাই সংযুক্ত যে সেই "সহজ" বিষয় গুলো নিয়ে ভাবি না। যেমন একটা উদাহরণ দেই,

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

আমি নিশ্চিত যে আপনি অবাক হয়ে যাবেন যে, এটা আদউ জিজ্ঞেস করার কিছু নাকি? খুব সম্ভবত বিশ্বাস না করে পাশ কাটিয়ে চলে যাবেন। কিন্তু ব্যাপারটা চিন্তা করুন ব্যাপারটা কি এতটাই সহজ? 

প্রথমত আপনার মেরুদন্ড ও পেশিতে আপনার শরীরের ওজন সহনের জন্য পর্যাপ্ত শক্তির ও ফাংশনালিটির প্রয়োজন হবে। এরপর আপনাকে দু পায়ে সঠিক ভাবে ব্যালেন্স করা জানতে হবে। এক পায়ে সাপোর্ট ঠিক রেখে অন্য পায়ের হাটু ভাজ করে উরুর উপরের পেশি প্রসারণ ও নিচের পেশির সংকোচন করে মধ্যাকর্ষন ব্যাবহার করে আপনার ভর সামনের দিকে পড়তে পড়তে আবারও সেই হাটু সোজা করে উরুর পেশির সংকোচন ও নিচের পেশির প্রসারণ ঘটিয়ে সেই পায়ে সাপোর্ট নিয়ে এসে অন্য পায়ে এই পুরো process টির repeat ঘটাতে হবে! এবং এই পুরো ব্যাপারটির loop বা বার বার করার মাধ্যমে আপনি হাটতে পারবেন। অথচ আপনি এত কিছু চিন্তা না করেই simply হেটেই যাচ্ছেন!

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

এখন জন্মের পর এরকম কত instinct নিয়ে আমরা চলাফেরা করছি একটু ভাবুন তো! হাঁটা, শ্বাস নেওয়া, কথা বলতে পারা, হাত দিয়ে আঁকড়ে ধরা, সাঁতার কাটা, দেহের যেকোন নড়ন, চোখ দিয়ে দেখে বস্তুর দূরত্ব নির্ণয় ইত্যাদি! লিখতে গেলে কতই লেখা যায়... 

আচ্ছা জৈবিক ছাড়াই চিন্তা করুন! প্রথম যখন সাইকেল চালাতে শিখেছেন আর একবার শিখে যখন তা instinct এর উপর ছেড়ে দিয়েছেন। অথবা আমার কথাই বলি Harry potter এর theme টা এখনও দিব্যি বাজাতে পারি guitar এ কিন্তু একটা note বা সুর মনে নেই। pure instinct দিয়ে সুর উঠছে! আবার এই যে এই লিখা গুলি আপনি পড়ছেন! ভাবুন তো প্রতিটা অক্ষর কি তা কি আপনাকে আলাদা করতে চিন্তা করতে হচ্ছে?

তো এতক্ষন বকর বকর করার সারমর্মটি হচ্ছে, আমরা এই "প্রত্যেকটা ধাপ চিন্তা করে" কোন কিছু করাতে অভ্যস্ত না! আমরা যতটা সম্ভব কোন কিছু একবার শিখে ওই instinct ব্যাপারটার উপর ছেড়ে দেই বা দিতে চাই। এবং এই কারণেই Algorithm এর মত একটা বিষয়ের অতীব সরলিকরণ বুঝতে আমাদের সমস্যা হয়। ওটা মোটেও আপনার বোঝার অক্ষমতা নয়। শুধু আমাদের অভ্যাসের দোষ। 

উপরের আলোচনা থেকে কি Algorithm ব্যাপারটা কি হতে পারে সে সম্পর্কে একটু ধারণা পেয়েছি?

"সুসংজ্ঞায়িত তথ্যের উপর ভিত্তি করে যুক্তিযুক্ত ধাপে ধাপে কিছু করা!"

মনে করুন একটা স্যান্ডুইচ বানানোর Algorithm কি হতে পারে? সহজ, তাইনা?

১. একটা পাউরুটি নিন
২. জ্যাম লাগান
৩. অন্য কিছু পছন্ড হলে তা লাগান বা রাখুন
৪. আরেকটি পাউরুটি তার উপরে রাখুন

ব্যাস এই কটি ধাপ যে কখনও স্যান্ডুইচ দেখেনি বা চেনেও না তাকে দিন সে বানিয়ে নিতে পারবে! ইহা একটি Algorithm! (সেই সেন্সে প্রতিটা খাবারের recipe-ও একেকটি Algorithm এবং তা সত্য!) 

খেয়াল করুন এখানে কিন্তু আমরা ধরেই নিয়েছি যে পাউরুটি, জ্যাম বা অন্যকিছু আগে থেকেই বানানো আছে বা এই Algorithm এর user জানে যে কি করে সেগুলো সংগ্রহ করতে হবে। কিন্তু এমন কোন user যদি আসে যে এগুলোও জানে না তখন? সেক্ষেত্রে আমাদের Algorithm টা আরও বড় করতে হবে। কি করে রুটি বা জ্যাম বানায় সেগুলোও যোগ করতে হবে! তখন কিন্তু Algorithm টি এত ছোট বা সহজ হবে না। প্রতিটা step এর জন্যে আরও sub-step থাকবে! কিন্তু তখন ব্যাপারটা আরও General হবে অর্থাৎ, সহজে না হলেও আরও বেশি সংখ্যক মানুষ কাজটি করতে পারবে!

আচ্ছা এখন একটি mathematical উদাহরণ নিয়ে চিন্তা করি। আপনি কি "ভাগ" করতে পারেন? যদি বলি পারেন না! তাহলে কি রাগ করবেন? খুব সম্ভবত আপনিও আমার মত ব্যাপারটা মুঘস্ত করেই এসেছেন। আমরা ভাগ করতে পারি কারণ আমরা গুণ করতে পারি বা নামতা গুলো আমাদের মুঘস্ত আছে! গুণ যদি না করতে পারতাম তাহলে কি ভাগ সম্ভব হত? ভাগের নিয়ম চিন্তা করুন তাহলেই বুঝে যাবেন যে, না! গুণ ছাড়া ভাগ সম্ভব হয়না। এখন গুণ কি? গুণ হচ্ছে যোগের loop! মানে দশ বার তিনকে যোগ করার নামই হল 10*3! তাই না? তাহলে যদি আপনাকে বলি আপনি এই যোগ ছাড়া কিছু পারেন না! অন্য কোন "মুঘস্ত নিয়ম" আপনার জানা নেই। আপনি শুধু এই ভাগ কি, গুণ কি তা জানেন এবং আপনি শুধু যোগ করতে পারেন! আর কিচ্ছু না! এখন আমায় একটি নিয়ম বের করে দিন যার মাধ্যমে আমি ১৬ কে ৩ দ্বারা ভাগ করতে পারি! বা ছোট ক্লাসের স্টাইলে বলি ১৬ টি আম তিন জন বন্ধুর মধ্যে সমান ভাগে ভাগ করে দিন! 

থামুন এবং ভাবুন! (না পারলে ক্ষতি নেই, এই ব্যাপারটাই আমরা overcome করতে চাচ্ছি!)

চলুন একসাথে চিন্তা করতে করতে এই নিয়মটা বের করার চেষ্টা করি!

প্রথমত আমরা যেটা করতে পারি তা হল চলুন না তাস বাটি! মানে,
ধাপ-১ঃ তিনজন কে একটা একটা করে আম দিতে থাকি অর্থাৎ mathematically একটা একটা করে ১ যোগ করতে থাকি ৩ জনে! 

এবার এক রাউন্ডে কতটি করে আম যাবে? ৩ টি! তাইনা? যেহেতু তিনজন কে একটি করে আম দিচ্ছি।
ধাপ-২ঃ তাহলে এরকম কতটি রাউন্ড হলে আমার ১৬টা আম শেষ হবে? ৩ এর সাথে তিন যোগ করতে থাকি! দেখি কত নম্বর রাউন্ডে তা ১৬ হয়! 

০+৩=৩, প্রথম রাউন্ড 
৩+৩=৬, এখনও ১৬ হয়নি, রাউন্ড-২
৬+৩=৯, এখনও ১৬ হয়নি, রাউন্ড-৩
৯+৩=১২, এখনও ১৬ হয়নি, রাউন্ড-৪
১২+৩=১৫, এখনও ১৬ হয়নি, রাউন্ড-৫
১৫+৩=১৮, এটা ১৬ এর থেকে বেশি! তাই এই রাউন্ডটা ধরলাম না!

ধাপ-৩ঃ ৫ম রাউন্ডে ১৫ টি আম সমান ভাগে ভাগ হয়ে গেল। কিন্তু এর পরের রাউন্ডে ১৮ হওয়ার কথা কিন্তু ১৮টি আমতো আমাদের কাছে নেই! তার অর্থ হল ১৬ টি আম ৩ জনকে দিলে সর্বোচ্চ ৫ বারে সমান ভাগে ভাগ সম্ভব। 

ধাপ-৪ঃ তাহলে কটি আম সমান ভাগে ভাগ হল? উপরের হিসাবে ৫ম রাউন্ড দেখলে বুঝতে পারবেন ১৫ টি! (এটিকেই আমরা basically 3*5=15 বলি!) অর্থাৎ ১৬-১৫=১ টি আম অতিরিক্ত থাকল। যেটি আমাদের ভাগশেষ!

হুহ! অনেক কিছু করে ফেললাম! ধাপ চারটি বোঝা শেষ। এখন এটিকে সহজে লিখে ফেলি,

যদি ১৬ কে ৩ দিয়ে ভাগ করতে হয় তো,

ধাপ ১ঃ ৩ কে একটি রাউন্ড ধরব।

ধাপ ২ঃ একটি একটি করে রাউন্ড বাড়াতে থাকব।

ধাপ ৩ঃ যে তম রাউন্ডে ১৬ এর সমান আসবে সেটি অথবা যে তম রাউন্ডে ১৬ থেকে বেশি আসবে তার আগের রাউন্ডটিকে ভাগফল বহনকারী রাউন্ড হিসেবে নেব। রাউন্ড সংখ্যাটাই হবে ভাগফল। (কারণ ওটাই ভাগের সংজ্ঞা।)

ধাপ ৪ঃ ভাগফল বহনকারী রাউন্ডে প্রাপ্ত যোগফলটি ১৬ থেকে বিয়োগ করব। ওটাই হবে আমাদের ভাগশেষ! 

ব্যাস! ১৬ কে ৩ দিয়ে ভাগ করার নিজের হাতে তৈরি Algorithm আমরা পেয়ে গেলাম! মজার ব্যাপার কি জানেন? এটা শুধু ১৬ কে ৩ দিয়ে ভাগ করার না। ১৬ এবং ৩ এর স্থলে যেকোন সংখ্যা বসিয়ে দিয়ে দেখুন! তার জন্যে সত্যি হবে! 

অর্থাৎ, যেকোন সংখ্যা a কে b দিয়ে ভাগ করতে চাইলে, (এটা না পড়লেও চলবে)

ধাপ ১ঃ b কে একটি রাউন্ড ধরব।

ধাপ ২ঃ একটি একটি করে রাউন্ড বাড়াতে থাকব।

ধাপ ৩ঃ যে তম রাউন্ডে a এর সমান আসবে তা অথবা যে তম রাউন্ডে a থেকে বেশি আসবে তার আগের রাউন্ডটি ভাগফল বহনকারী রাউন্ড হিসেবে নেব। তমটিই হবে ভাগফল। (কারণ ওটাই ভাগের সংজ্ঞা।)

ধাপ ৪ঃ ভাগফল বহনকারী রাউন্ডে প্রাপ্ত যোগফলটি a থেকে বিয়োগ করব। ওটাই হবে আমাদের ভাগশেষ!

অর্থাৎ, শুধু ১৬ এর স্থলে a এবং ৩ এর স্থলে b বসিয়ে দিলাম! 

হয়ে গেল আমাদের ভাগের Algorithm! a ও b এর মান যাই বসান ওই দুটো সংখ্যার একটিকে অপরটি দিয়ে ভাগ করতে পারবেন। জানি একটু জটিলই ছিল কিন্তু বুঝতে চেষ্টা করুন। এই গাণিতিক উদাহরণটির আগে কি কি আরও বলেছিলাম তা একটু ভাবুন। স্টেপ গুলো logically ভেবে বের করাটাই হল চ্যালেঞ্জ! এই কাজটা করতেই Competitive Programmer রা এত আনন্দ পায়! যখন বার বার ভুল করে মাথা খাটিয়ে অনেক্ষন পর কাঙখিত ফলাফল চলে আসে সেটায় যে কি তৃপ্তি! উদ্যেশ্য ও সংজ্ঞা আপনার সামনে, এখন রাস্তাটা খুজে বের করুন যেন একটি জড় পদার্থ যার বিন্দু মাত্র instinct-ও নেই (যেমন কম্পিউটার) সেও অনায়েশে এই কাজটা করতে পারে! তাই অবস্যই একটি ধাপের সাথে আরেকটি ধাপের logical সম্পর্ক থাকতে হবে। 

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

আমি উপরে Programmer বা Programming শব্দটা ব্যাবহার করলাম। এটা আবার কি!? পৃথিবীতে কত শত ভাষা আছে জানেন কি? গুগলে একটা সার্চ দিয়েন! হতবাক হয়ে যাবেন! আমি যদি কোন একটা কাজকে উপরের উদাহরণের মত করে logically উপস্থাপন করতে চাই তবে তা কোন ভাষায় করব!? উপরে তো বাংলা ও সামান্য ইংরেজিতে করলাম! আর এটা আবার computer কেও বুঝাতে হবে! শুধু আপনি আমি বুঝলেও হবে না! সেই জন্যেই চলে আসে আমাদের প্রাণ প্রিয় Programming language ভাই! তিনি নিজে এমন একটি simplified ভাষা যিনি কোন অতিরঞ্জন করনে বিশ্বাসি না! অর্থাৎ আপনি আমি হয়ত বাংলায় কম্পিউটারকে ১৬ কে ৩ দিয়ে ভাগ করতে বলার জন্য এভাবে বলতে পারেন,

"হে আমার প্রিয়তমা কম্পিউটার! সারা দাও! ১৬ কে ৩ দ্বারা ভাগ করে স্ক্রিনে দেখাও!"

কিন্তু এত শব্দের অপব্যাবহার Programming language করতে চাইবে না। যেমন python কাঠখোট্টা ভাই সোজাসুজি বলে দেবে,

print(16/3)

এটাই। অন্য language এ বিভিন্ন প্রযুক্তিগত সুবিধার কথা চিন্তা করে বিভিন্ন syntax হতে পারে। 

এখন ভাগের সব থেকে সহজ Algorithm python এ set করাই আছে! তাই ১৬/৩ বললেই সে automatic সেই Algorithm execute করে! অথবা উপরে আমাদের নিজেদের আবিষ্কৃত Algorithm দিয়েই ভাগ করার চেষ্টা করতে পারি।

এখানে একটা মজার কথা বলে রাখি। ধরুন একটি computer ১ বিলিয়ন code এর লাইন ১ সেকেন্ডে execute করতে পারে। অর্থাৎ আমাদের উপরের ভাগের Algorithm টি ৩ বিলিয়ন সংখ্যাটিকে ৩ দিয়ে ভাগ করার জন্যে ১ বিলিয়ন বার যোগ operation করবে! যাতে তার ১ second সময় লাগবে! চিন্তা করুন যদি এরকম ১ বিলিয়ন বিলিয়ন বার যোগ করতে হয় তখন? (এবং বিশ্বাস করুন আধুনিক তথ্যবহুল জগতে এটা খুবি নগন্য সংখ্যা!) সামান্য একটা ভাগের অংক করতে তার ১ বিলয়ন সেকেন্ড, প্রায় ৩১ বছর লেগে যাবে!!! তাই অবস্যই আমাদের উপরের Algorithm টি সব থেকে efficient নয়!

Programming হল এই Algorithm এর কার্যকর ব্যবহার! computer এমন একটি যন্ত্র যা আমাদের কাছে আপাতদৃষ্টিতে কঠিন কাজ অতিব দ্রুত করে ফেলতে পারে। উপরেই দেখুননা! আমাদের Algorithm টিতেই ১ বিলিয়ন অবধি calculation ১ সেকেন্ডে করে ফেলছে! হাতে হাতে করতে শুরু করুন! পুরো জীবনেও শেষ করতে পারবেন নাহ! তাই computer এর এই মহান ক্ষমতা "দ্রুত করতে পারা!" কাজে লাগিয়ে আমরা এমনও অসাধ্য সাধন করছি যা আমাদের সপ্নেরও বাইরে ছিল এক সময়! আমি তো শুধু একটি intro দিলাম। 

Algorithm লেখা একটা সিড়ি বেয়ে ওঠার মত। কিন্তু সেই সিড়ির প্রতিটা ধাপও আপনাকে নিজে নিজে তৈরি করে নিতে হবে! অর্থাৎ এই পুরো process টাতেই একটা চড়ম মাত্রার নিজস্বতা আছে। এটাই coding এর আনন্দ! আপনার নিজের সৃষ্টির সাফল্য নিজে দেখতে পারবেন। তা ইচ্ছামত পরিবর্তনও করতে পারবেন। একটি character building rpg এর মত চিন্তা করা যেতে পারে! আর কি রকম জিনিস তৈরি করতে পারেন তা তো আপনাদের হাতের মুঠোতেই প্রতিদিন ঘোরাফেরা করছে। 

শুরুতে কি বলেছিলাম মনে আছে? আমরা instinct দিয়েই কাজ করতে পছন্দ করি। তো এতক্ষন Alogorithm বলতে আমরা যা বুঝলাম তা হতে কি আমরা এটা বলতে পারি যে, instinct হল আমাদের নিজের মস্তিস্কের Algorithm ধারণের জায়গা? যে একবার ওটা শিখে সেট করে দেই এরপর সে নিজে নিজেই তা মেনে ওই কাজ সম্পন্ন করে! চিন্তা করুন। বস্তু জগতও কিছু Algorithm এর সমন্বয়েই চলে। তা খুজে বের করার কাজটাই করছেন বিজ্ঞানিরা। যাই হোক, সেটা অন্যদিনের আলোচনার বিষয়! 

Programming language দিয়ে আমরা computer এর বোধগম্য Algorithm লিখি। Programming language দিয়ে আমরা যা ইচ্ছা তাই এরকম নির্দেশনা দেই, সেটা আবার Algorithm related নাও হতে পারে। কারণ Algorithm এর সুনির্দিষ্ট ফলাফল থাকতে হবে কিন্তু Programming language দিয়ে আপনি হিজিবিজি যা ইচ্ছা লিখতে পারেন! একটি Programme এর একাধিক Algorithm থাকা সম্ভব!

আজকের আলোচনার মূল take away ছিল Algorithm এর মৌলিক সংজ্ঞাটা বোঝা এবং Programming সম্পর্কে সামান্য ধারণা লাভ করা! এটা প্রচন্ড বিস্তর একটি বিষয় যা নিয়ে কাজ করতে আপনি আপনার পুরো জীবনটাই অতিবাহিত করতে পারবেন!

পরিশেষে বলি, উপরে আলোচিত সব কিছুই Algorithm নিয়ে আমার নিজের understanding। নিজের ভাষাতেই তুলে ধরলাম। তাই কোন রেফারেন্স বা কিছু ব্যবহার করিনি। ভাল থাকবেন সবাই!


লিখাঃ মোঃ আহনাফ সাদিক ইনান

Post a Comment

Previous Post Next Post

Contact Form