পর্ব ১

কম্পিউটার প্রোগ্রামিংয়ে সঠিকভাবে অ্যালগরিদম নির্বাচন করতে পারাটা খুবই জরুরি। গণিতে আমরা দেখি, একটি সমস্যাকে অনেকভাবেই সমাধান করা যায়। কিন্তু সহজ উপায়ে, কম ধাপে, স্বল্পায়াসে সমাধান করাটা গণিতজ্ঞের বিশেষত্ব। প্রোগ্রামিংয়েও একই কথা প্রযোজ্য। আজকের পর্বটিতে শুধু অ্যালগরিদম নিয়েই আলোচনা করা হবে। অ্যালগরিদমই হচ্ছে প্রোগ্রামিংয়ের যৌক্তিক অংশ। প্রোগ্রামিং শিখতে হলে সবার প্রথমে প্রয়োজন যৌক্তিক চেতনা গঠন (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 ভ্যরিয়েবলের সহায়তায় সহজেই কাঙ্খিত ফলাফলটি পাওয়া যাবে।

তাহলে অ্যালগরিদম হতে পারে এরকমঃ

প্রতিটি ভ্যারিয়েবলই নির্দিষ্ট পরিমান মেমোরি দখল করে। প্রথম উপায়ে আমরা সমাধানে পৌঁছেছি ১০টি ভ্যারিয়েবল নিয়ে কাজ করে কিন্তু দ্বিতীয় উপায়ে মাত্র ৪টি ভ্যারিয়েবল ব্যবহার করেই একই ফলাফল পেয়েছি। অর্থাৎ কম মেমোরিকেই দক্ষতার সাথে ব্যবহার করে সমাধান পাওয়া গিয়েছে। তাই দ্বিতীয় উপায়টি দক্ষতর।

এভাবে ন্যুনতম গণনার জটিলতা, কম সময়ে সমস্যা সমাধান, ন্যুনতম মেমোরি ব্যবহার করে দক্ষ অ্যালগরিদম তৈরি করতে হয়।

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