কম্পিউটার প্রোগ্রামিংয়ে সঠিকভাবে অ্যালগরিদম নির্বাচন করতে পারাটা খুবই জরুরি। গণিতে আমরা দেখি, একটি সমস্যাকে অনেকভাবেই সমাধান করা যায়। কিন্তু সহজ উপায়ে, কম ধাপে, স্বল্পায়াসে সমাধান করাটা গণিতজ্ঞের বিশেষত্ব। প্রোগ্রামিংয়েও একই কথা প্রযোজ্য। আজকের পর্বটিতে শুধু অ্যালগরিদম নিয়েই আলোচনা করা হবে। অ্যালগরিদমই হচ্ছে প্রোগ্রামিংয়ের যৌক্তিক অংশ। প্রোগ্রামিং শিখতে হলে সবার প্রথমে প্রয়োজন যৌক্তিক চেতনা গঠন (logic development), যা কেবল অ্যালগরিদম অনুশীলনের মাধ্যমে হতে পারে। কোন প্রোগ্রামের অ্যালগরিদম তৈরি হয়ে গেলে যে কোন ভাষায় নির্দেশ লেখার নিয়ম (Syntax) জানা থাকলেই ঐ ভাষায় প্রোগ্রামটি লিখে ফেলা যায়। অ্যালগরিদম যে কোন ভাষার জন্য একই থাকে। অর্থাৎ, অ্যালগরিদম প্রোগ্রামিং ভাষা নিরপেক্ষ।
একই সমস্যা সমাধানের জন্য একাধিক অ্যালগরিদম লেখা যেতে পারে, যার প্রত্যেকটি সঠিক উত্তর প্রদান করে। সেগুলো থেকে এমনভাবে অ্যালগরিদম নির্বাচন করতে হবে যাতে,
১) গণনাজনিত জটিলতা (Computational Complexity) কম থাকে, ফলে কম সময়ে ফলাফল প্রদান করতে পারে। (Time Efficiency)
২) কম্পিউটারের মেমোরিকে দক্ষভাবে ব্যবহার করতে পারে। (Memory/Storage Efficiency)
উভয় শর্তের জন্য আমরা উদাহরণের মাধ্যমে বোঝার চেষ্টা করব। প্রথম শর্তের জন্য আমরা একটি সহজ সমস্যাকে দুইভাবে সমাধান করব এবং তার থেকে উপযুক্ত পদ্ধতিটি বাছাই করে নেব।
মনে করি, আমাদের ১ থেকে ১০০ এর মধ্যে ৫ দ্বারা বিভাজ্য সংখ্যাগুলো বের করতে হবে। এই সমস্যা সমাধানের দুটি অ্যালগরিদম এখানে দেওয়া হয়েছে।
পদ্ধতি ১
আমরা কম্পিউটারকে ১ থেকে ১০০ পর্যন্ত সবক’টি সংখ্যা নিয়ে ৫ দিয়ে ভাগ করে যাদের ভাগশেষ ০ পাওয়া গিয়েছে তাদের নির্বাচন করার নির্দেশ দিতে পারি। তাহলে অ্যালগরিদমটি হতে পারে এরকমঃ
পদ্ধতি ২
আবার ভিন্ন পন্থা অবলম্বন করেও সমাধান আসতে পারে। ৫ দ্বারা বিভাজ্য সকল সংখ্যা ৫ এর গুণিতক হতে বাধ্য। তাই প্রত্যেক পূর্ণ সংখ্যাকে ৫ দিয়ে গুণ করে ১০০ পর্যন্ত গুণফল বিবেচনায় এনে সমস্যাটির সমাধানের কথা ভাবা যেতে পারে। এই পদ্ধতিতে অ্যালগরিদমটি হবেঃ
উভয় অ্যালগরিদমই সঠিক উত্তর দেবে। পদ্ধতি ১ এ গণনার কাজটি ১০০ বার পরিচালনা করতে হবে। কিন্তু পদ্ধতি ২ এ ২০ বারের গণনায় সকল উত্তর পাওয়া যাবে। অর্থাৎ, পদ্ধতি ২ এ গণনার জটিলতা হ্রাস পাচ্ছে, ফলে সময়ও কম লাগবে। তাই ২য় পদ্ধতিটি অপেক্ষাকৃত দক্ষ বলে আমরা দাবি করতে পারি।
এবার আমরা অ্যালগরিদম নির্বাচনের দ্বিতীয় শর্ত নিয়ে ভাবতে চাই। চার অঙ্কের দুটি সংখ্যার গুণফল নির্ণয়ের মাধ্যমে কম্পিউটারের মেমোরির দক্ষ ব্যবহারের বিষয়টি পর্যবেক্ষণ করতে পারি। মনে করি, সংখ্যা দুটি A এবং B, যাদের মান যথাক্রমে 1234 এবং 3246. আমরা জানি, দুটি বড় বড় সংখ্যার গুণফল অনেকগুলো ছোট ছোট গুণফলেরই সমষ্টি। এই ছোট গুণফলগুলো নির্ণয় করার জন্য বিভিন্নভাবে মেমোরিকে ব্যবহার করা যায়। সংখ্যা দুটিকে গুণ করার গাণিতিক প্রক্রিয়াটি এরকমঃ
এখানে (ii), (iii), (iv) ধাপে প্রাপ্ত গুণফলগুলো যথাক্রমে ১, ২ ও ৩ ঘর বামে সরে গিয়েছে। কম্পিউটার X চিহ্ণিত জায়গাগুলোকে 0 দিয়ে প্রতিস্থাপন করে নেবে। তাই (ii) এর প্রাপ্ত গুণফলকে 10 দিয়ে, (iii) এর প্রাপ্ত গুণফলকে 100 দিয়ে, (iv) এর প্রাপ্ত গুণফলকে 1000 দিয়ে গুণ করে চূড়ান্ত গুণফল পেতে হবে। তাহলে এই পদ্ধতির বিভিন্ন রাশিকে আমরা বিভিন্ন ভ্যারিয়েবলে সংরক্ষণ করতে পারি। ভ্যারিয়েবলগুলো A, B, C, D, E, F, G, H, I, Result ইত্যাদি নামে চিহ্ণিত।
লক্ষ্য করলে দেখা যায়, (i),(ii),(iii),(iv) ধাপগুলোতে আমরা B এর একটি করে অঙ্ক (digit) নিয়ে A এর সাথে গূন করেছি। B = 3246 এর জন্য প্রতিটি ডিজিটকে আমরা আলাদাভাবে প্রকাশ করতে পারি।
তাহলে এই পদ্ধতির অ্যালগরিদমটি হবেঃ
এই সমস্যাটিকেই আমরা মেমোরির আরও দক্ষ ব্যবহারের মাধ্যমে সমাধানের চেষ্টা করতে পারি। আমরা একটি ভ্যারিয়েবল নিতে পারি যার নাম index. B এর যত তম digit নিয়ে আমরা কাজ করব, index এর মান তখন ততই হবে।
শুরুতে index=0 এবং Result=0 থাকবে। এবং প্রতি ধাপ গুণফল শেষ করে index এর মান এক করে বাড়বে। আমরা Result= Result+ A*B [index] * 10^(index) এই সূত্রটি ব্যবহার করতে পারি। গুণফলের বিভিন্ন ধাপে index এর মান 0,1,2,3 ইত্যাদি হবে। (ii),(iii),(iv) ধাপে প্রাপ্ত ফলাফলকে 10^1, 10^2, 10^3 ইত্যাদি দিয়ে গুণ করতে হবে। index ভ্যরিয়েবলের সহায়তায় সহজেই কাঙ্খিত ফলাফলটি পাওয়া যাবে।
তাহলে অ্যালগরিদম হতে পারে এরকমঃ
প্রতিটি ভ্যারিয়েবলই নির্দিষ্ট পরিমান মেমোরি দখল করে। প্রথম উপায়ে আমরা সমাধানে পৌঁছেছি ১০টি ভ্যারিয়েবল নিয়ে কাজ করে কিন্তু দ্বিতীয় উপায়ে মাত্র ৪টি ভ্যারিয়েবল ব্যবহার করেই একই ফলাফল পেয়েছি। অর্থাৎ কম মেমোরিকেই দক্ষতার সাথে ব্যবহার করে সমাধান পাওয়া গিয়েছে। তাই দ্বিতীয় উপায়টি দক্ষতর।
এভাবে ন্যুনতম গণনার জটিলতা, কম সময়ে সমস্যা সমাধান, ন্যুনতম মেমোরি ব্যবহার করে দক্ষ অ্যালগরিদম তৈরি করতে হয়।
আলোচিত গুণফলের অ্যালগরিদমগুলোর প্রোগ্রাম লিখতে হলে আমাদের ডেটা স্ট্রাকচার সম্পর্কে জানতে হবে। এ পর্যন্ত আমরা ব্যবহারকারীর কাছ থেকে ইনপুট নিয়ে অ্যালগরিদম লিখেছি। কম্পিউটারের মেমোরিতে সংরক্ষিত ডেটাবেসের জন্য অ্যালগরিদম লিখতে হলেও ডেটা স্ট্রাকচার সম্পর্কে সম্যক ধারণা থাকা জরুরি। সেক্ষেত্রেও অবশ্য অ্যালগরিদম নির্বাচনের কিছু বিচার্য বিষয় থাকে। তাই আমরা ডেটাবেস অ্যালগরিদম, ডেটা স্ট্রাকচার এই বিষয়গুলোতে আগ্রহী হতে পারি।
তুহিন তালুকদার,
আপনার লেখা আর মন্তব্য পড়ে মনে হচ্ছে – আপনি বলতে চাইছেন আগে অ্যালগরিদম শিখতে হবে, এরপর প্রোগ্রামিং। অথচ আপনার দেয়া উদাহরণগুলো অনেকটা প্রোগ্রামিংয়ের মতো। প্রোগ্রামিংয়ের বেসিক জানা থাকলে এই উদাহরণগুলো বুঝা আরো সহজ হতো না? নন-প্রোগ্রামারদের জন্য কিন্তু ফ্লোচার্ট বেশি কাজের।
@প্রতিফলন,
আমি লেখাটিতেই উল্লেখ করেছি, প্রোগ্রামিং শিখতে হলে সবার প্রথমে প্রয়োজন logic development. এরপরের কাজ শুধু syntax অনুযায়ী প্রোগ্রামটি লেখা। এখানে প্রোগ্রাম লেখার উপযুক্ত উদাহরণই নেওয়া হয়েছে। তাই আপনার মনে হয়েছে,
কিন্তু আমি চেয়েছি কোন একটি সমস্যা প্রোগ্রামের মাধ্যমে সমাধানের আগে কোন পদ্ধতিতে সমাধানের দিকে এগিয়ে যেতে হবে তা আলোচনা করতে।
অ্যালগরিদমের আগে ফ্লোচার্ট বিশেষ কাজে দেবে বলে আমার মনে হয় না। কারণ, ফ্লোচার্ট অ্যালগরিদমেরই graphical representation.
আমার চেষ্টাই তো প্রোগ্রামিং ক্ষেত্রে logic development নিয়ে, সরাসরি ফ্লোচার্ট বা কোড লিখে দিলে নন-প্রোগ্রামাররা সমাধানটা সরাসরি পেয়ে যাবেন, কিন্তু নিজে থেকে problem solving এর যুক্তিবোধ তৈরি হবে না।
@তুহিন তালুকদার,
ছবি একটা ইউনিভার্সাল ল্যাংগুয়েজ, সাধারণ টেক্সট এর চেয়ে সবসময়েই বেশি কিছু প্রকাশ করে। তাই টেক্সটের চেয়ে গ্রাফিক্যাল রিপ্রেজেন্টেশনকে (যা অনেকটা ছবির মতো) বেশি কার্যকর মনে হয়।
লজিক ডেভেলাপমেন্টের অন্যতম পূর্বশর্ত হলো – সমস্যাটা ভালোভাবে বুঝা ও এরপর সেটা সমাধানের পরিকল্পনা করা। এই পরিকল্পনার সম্পাদিত রূপই হলো অ্যালগরিদম – সেটা লিখিত হোক, কিংবা চিত্রিত। ফ্লোচার্ট দিয়ে যদি কেউ ভালভাবে সমস্যাটা বুঝতে পারে, তবে সেটাই লজিক ডেভেলাপমেন্টের জন্য বেশি কার্যকর।
এছাড়া, যেকোন বুদ্ধিভিত্তিক অনুশীলনের মাধ্যমেই যৌক্তিক চেতনার বিকাশ ঘটতে পারে, সেটা হোক পাজল মিলানো, কিংবা শর্টকাট রাস্তায় বাসায় পৌঁছানো, অথবা দাবা খেলা।
আমি আমার মতামত দিলাম মাত্র, তবে লেখার ব্যাপারে আপনার ইচ্ছাই মুখ্য। শুভকামনা। (F)
@প্রতিফলন,
ঠিক কথা, কিন্তু ফ্লোচার্টে অনেকগুলো প্রতীক আছে (পর্ব ১ এর প্রতীকগুলো একটি উপাংশ মাত্র)। তাই প্রতি পর্বে ব্যবহৃত নতুন প্রতীকগুলো ব্যাখ্যা করে বুঝাতে হবে। ফ্লোচার্টের প্রতীকগুলোর একটি ছবির জন্য এখানে দেখুন।
এমনিতেই একটি সমস্যাকে পরিষ্কারভাবে তুলে ধরতে অ্যালগরিদমের বাইরেও প্রচুর আলোচনা করতে হয়। প্রতীকগুলোকেও ব্যাখ্যা করতে হলে, এক পর্বে একটির বেশি সমস্যা আলোচনা করা যাবে না।
তাছাড়া কিছু কিছু ক্ষেত্রে ফ্লোচার্ট দেখে নন-প্রোগ্রামারেরা শুরু কোথায় শেষ কোথায় বুঝতে পারেন না। তেমন উদাহরণ দেখুন।
তবে পাঠকের সুবিধাই সর্বাগ্রে বিবেচ্য। আপনারা চাইলে অবশ্যই ফ্লোচার্ট যোগ করা হবে তবে সেক্ষেত্রে সেই বড় কলেবরের লেখাটি পড়ার প্রতিশ্রুতি দিতে হবে। 😉
@তুহিন তালুকদার,
আমাদের কিছু “ট্রেনিং পাঠক” ও “টেস্ট পাঠক” দরকার, যারা লেখাগুলোর সহজবোধ্যতা তৈরিতে ও টেস্ট করতে সাহায্য করবে, অনেকটা নিউরাল নেটওয়ার্কের “ট্রেনিং সেট” আর “টেস্ট সেট” এর মতো। 😉
@প্রতিফলন,
সহমত। (Y)
আরো পর্ব দেখার অপেক্ষায় থাকলাম।
স্পেস কমপ্লেক্সিটি এর উদাহরণটা বড় হয়ে গেছে। পাথকের মনোযোগ ধরে রাখার জন্য ছোট উদাহরণ হলে ভালো। আর। নেট-এখুঁজলেও আরো ছোট উদাহরণ পাওয়া যেত।আসলে অনেক পাঠক-ই এই কনসেপ্টগুলোর সাথে নতুন পরিচিত হচ্ছেন, তাই তারা পরিচিত হতে এত বেশি সময় নিতে চাইবেন না।
এটা আমার ধারণা। কিন্তু, অবশ্যই আপনি যেটা ভালো মনে করবেন সেটাই শেষ কথা।
@মইনুল রাজু,
আসলে এখানে ব্যবহৃত সব উদারহণই লেখার মুহুর্তে আমার নিজের করা। দক্ষ অ্যালগরিদম নির্বাচনের উদাহরণটাই অদক্ষ হয়ে গেল। :lotpot:
লেখার বিশুদ্ধতার জন্যই মূলত নিজের উদাহরণ দিতে চেয়েছিলাম।
সেটাই হয়তো ভাল হত। স্পেস কমপ্লেক্সিটি উদাহরণটা নিয়ে শুরু থেকেই এই দুশ্চিন্তায় ছিলাম।
গত পর্বে আপনার সাথে আলোচনা আমাকে আজকের পর্ব লেখায় জায়গায় জায়গায় সাহায্য করেছে। মন্তব্য অবশ্যই কাম্য।
ভালো লেগেছে লেখাটা। আরেকটু সহজ করে হয়তো লেখা যেত তবে সবমিলিয়ে ভালো হয়েছে। আরো কিছু পর্বের পর bitwise flagging নিয়ে লিখতে পারেন,মেমরি বাচানোর এটা খুব ভালো একটি পদ্ধতি।
মনে হচ্ছে মুক্তমনায় কোড পাবলিশ করার প্লাগইন ইনস্টলের সময় হয়েছে।
@রামগড়ুড়ের ছানা,
এটা সম্পূর্ণই ভাষার উপর আমার দখলের অভাব। 🙁
লেখাটি পোস্ট করার পর থেকেই ভাবছি, সহজ ভাষায় লেখা হল না … কেমন যেন হিজিবিজি করে ফেললাম। তারপরও কষ্ট করে পড়ার জন্য ধন্যবাদ।
আমারও ইচ্ছে তেমনই।
সরাসরি কোন প্রোগ্রামে গিয়ে কি করতে হবে তা লিখলে খুব ভালো হত। আমাদের মতো বোকাদের জন্য লিখেছেন তাতেই অবশ্য অনেক ধন্যবাদ পাওয়া উচিৎ।
@বাসার,
ধন্যবাদ পড়ার ও মন্তব্যের জন্য।
আসলে প্রথম কয়েক পর্ব অ্যালগরিদম নিয়ে লিখতে চাই। কারণ, প্রোগ্রামিং এর জন্য লজিক ডেভেলপমেন্ট অনেক বেশি জরুরি। লজিক জানা থাকলে বাকিটুকু অনেক স্বল্পসময়েই শিখে ফেলা যায়।
প্রোগ্রামিংয়ে আপনার আগ্রহকে সম্মান জানাচ্ছি।