যুক্তি বা লজিক হচ্ছে প্রমাণের ভিত্তিতে সিদ্ধান্ত গ্রহন। যুক্তি তাই সবসময় রীতিসিদ্ধ। দর্শন এবং গণিতে ব্যাপকভাবে লজিক টার্মটি উচ্চারিত হয়। কম্পিউটার প্রোগ্রামিংয়ে গাণিতিক যুক্তির সহায়তা নেওয়া হয়। প্রোগ্রামিং তাই গণিতের উপর বিশেষভাবে নির্ভরশীল। কম্পিউটিং মানে গণনা আর গণনার জন্য চাই গাণিতিক যুক্তি। কম্পিউটিং এর কাজ পরিচালনা করতে যৌক্তিক পদ্ধতিতে চিন্তা করতে পারাটা খুব জরুরি। যুক্তিকে ব্যবহার করেই কম্পিউটেশনের ধাপগুলো গড়ে তুলতে হয়। আমরা কম্পিউটারকে দিয়ে কোন কাজ করানোর জন্য প্রোগ্রাম লিখি। প্রোগ্রামিং এ কিছু স্বতঃসিদ্ধ (axiom) ও নিয়ম কানুন ব্যবহার করা হয় যা গাণিতিক বিচারে যৌক্তিক। সরাসরি প্রোগ্রাম লেখার আগে আমরা অ্যালগরিদম, ফ্লো-চার্ট ইত্যাদি তৈরি করি। এগুলোতে আমরা মূলত কম্পিউটারকে দিয়ে নির্দিষ্ট কাজ করানোর জন্য যৌক্তিক কাঠামো তৈরি করি।
একটি প্রোগ্রামের মাধ্যমে কোন সমস্যা সমাধানের কাজটি সাধারণত কয়েকটি ধাপে করা হয়। এই ধাপের সমষ্টিই অ্যালগরিদম। অ্যালগরিদমের ধাপগুলো কিছু তথ্য বা ডেটার উপর কাজ করে। অধিকাংশ প্রোগ্রামই কিছু ডেটাকে ইনপুট হিসেবে নেয়, তার উপর কয়েকটি ধাপে কাজ সম্পন্ন করে আউটপুট তৈরি করে। অ্যালগরিদম ইনপুট থেকে আউটপুট পাওয়ার কার্যপদ্ধতি বর্ণনা করে। আমরা গাণিতিক ফাংশনের মাধ্যমে দুটি সংখ্যা যোগ করার প্রোগ্রামকে প্রকাশ করতে পারি।
অ্যালগরিদমের কিছু বৈশিষ্ট্য থাকেঃ
১) ইনপুটঃ ইনপুট ডেটা, সাধারণত ব্যবহারকারী প্রদান করে
২) আউটপুটঃ প্রোগ্রামের ফলাফল
৩) সসীম ধাপঃ সীমিত সংখ্যক ধাপে অ্যালগরিদম শেষ হবে
৪) সুনির্দিষ্টতাঃ ধাপগুলোর অর্থ সুনির্দিষ্ট হবে, দ্ব্যর্থক হতে পারবে না।
৫) কার্যকারিতাঃ অ্যালগরিদম এমন হবে যেন তা কম্পিউটার প্রোগ্রামে (যে কোন ভাষায়) রূপান্তরযোগ্য হয়।
১) ইনপুটঃ ইনপুট ডেটা, সাধারণত ব্যবহারকারী প্রদান করে
২) আউটপুটঃ প্রোগ্রামের ফলাফল
৩) সসীম ধাপঃ সীমিত সংখ্যক ধাপে অ্যালগরিদম শেষ হবে
৪) সুনির্দিষ্টতাঃ ধাপগুলোর অর্থ সুনির্দিষ্ট হবে, দ্ব্যর্থক হতে পারবে না।
৫) কার্যকারিতাঃ অ্যালগরিদম এমন হবে যেন তা কম্পিউটার প্রোগ্রামে (যে কোন ভাষায়) রূপান্তরযোগ্য হয়।
আমরা একটি গাণিতিক সমস্যা সমাধানের মাধ্যমে অ্যালগরিদম ও তার বৈশিষ্ট্যগুলো বুঝতে চেষ্টা করতে পারি। মনে করি, আমরা একটি সংখ্যা n এর ফ্যাক্টোরিয়াল বের করতে চাই। কোন পূর্ণ সংখ্যার ফ্যাক্টোরিয়াল হল ঐ সংখ্যা ও তার চেয়ে ছোট সকল পূর্ণ সংখ্যার গুণফল। যেমন, 6 এর ফ্যাক্টোরিয়ালের মান হবে 6*5*4*3*2*1 = 720. কম্পিউটারে যেকোন সংখ্যার ফ্যাক্টোরিয়াল নির্ণয়ে আমরা নিচের ধাপগুলো অনুসরণ করে নির্দেশ দিতে পারি।
এখানে n এর মান ব্যবহারকারীর কাছ থেকে নেওয়া হচ্ছে (ইনপুট) এবং এর ফ্যাক্টোরিয়াল প্রিন্ট হচ্ছে (আউটপুট)। n এর মানের উপর ভিত্তি করে ৪, ৫, ৬ ধাপগুলো পুনরাবর্তিত হবে কিন্তু n এর সসীম মানের জন্য অ্যালগরিদমের ধাপগুলো সসীম সংখ্যক বার ব্যবহৃত হবে (সসীম ধাপ)। উক্ত ধাপগুলো অবলম্বন করলে n এর একটি মানের জন্য একাধিক উত্তর পাওয়া যাবে না (সুনির্দিষ্টতা)। অ্যালগরিদমটির কার্যকারিতা আমরা একটি ছকের মাধ্যমে n=6 ধরে নিয়ে দেখতে পারি।
উক্ত অ্যালগরিদমকে আমরা ফ্লো-চার্টের মাধ্যমে দেখাতে পারি। ফ্লো-চার্ট হল অ্যালগরিদমের চিত্রিত উপস্থাপনা। এতে কিছু সংযুক্ত প্রতীকের মাধ্যমে তথ্য ও কন্ট্রোলের প্রবাহ(ফ্লো) দেখানো হয়। ফ্লো-চার্টের প্রতীক ও এর তাৎপর্য জানতে আমরা নিচের ছকটি দেখতে পারি।
আমরা প্রতীকগুলো ব্যবহার করে ফ্যাক্টোরিয়ালের ফ্লো-চার্ট আঁকতে পারি।
এবারে আমরা দেখব, উক্ত অ্যালগরিদমকে কোন প্রোগ্রামিং ভাষায় রূপান্তর করা যায় কি না। একটি নমুনা প্রোগ্রামিং ভাষা হিসেবে C ব্যবহার করে আমরা চেষ্টা করতে পারি। প্রোগ্রামটিতে /* এবং */ চিহ্নের মাঝখানের সকল লেখা কমেন্ট বলে বিবেচ্য হবে এবং কম্পাইলার তাকে C ইন্সট্রাকশান হিসেবে পড়বে না।
অর্থাৎ, অ্যালগরিদমটি প্রোগ্রামিং ভাষায় রূপান্তরযোগ্য বা কার্যকরি। এভাবে ভিন্ন ভিন্ন কাজের জন্য অ্যালগরিদম লিখে প্রোগ্রামিং করা সম্ভব। প্রবলেম ডোমেইনের উপর ভিত্তি করে কম্পিউটার প্রোগ্রাম কয়েক লাইন থেকে কয়েক হাজার লাইন পর্যন্ত হতে পারে।
কম্পিউটার প্রোগ্রামিং বর্ণময় এক যৌক্তিক রাজ্য। প্রতি পদক্ষেপে যুক্তির ছোট ছোট বুননে বিশাল রাজ্যটি গড়ে ওঠে এতে। যে রাজ্যের প্রতিটি ধুলিকণাই যুক্তির কাঠামোতে গড়া। ক্ষুদ্র ক্ষুদ্র যুক্তির বুননে গড়ে ওঠে জটিল জটিল অপারেটিং সিস্টেম, অ্যাপ্লিকেশন, গেমস ও সফটওয়্যার। এই যুক্তিগুলোর একে অন্যের সাথে সামান্য সংঘাত থাকলেই পুরো রাজ্যটি ধ্বসে পড়তে পারে। তাই খুব সতর্কতার সাথে এসব যুক্তি নির্ধারণ করতে হয়। তাই কম্পিউটার হয়ে উঠেছে যুক্তির এক বিশাল বিকাশক্ষেত্র, বুদ্ধিমত্তার চরম উৎকর্ষভূমি। কম্পিউটার প্রোগ্রামিং শুধু মানুষের গণনার কাজকে সহজ করতেই নয়, ব্যবহৃত হতে পারে মানুষের যুক্তিবাদী মনন বিকাশে। বাংলাদেশের মত দুর্বল অর্থনীতির দেশে যুবসমাজ প্রোগ্রামিং শিখে স্বল্পসময়েই নিজেদের দক্ষ জনশক্তিতে রূপান্তর করতে পারে। জনশক্তি রপ্তানিতে প্রোগ্রামারেরাও স্থান করে নিতে পারে। উন্নত বিশ্বে বিপুল পরিমাণ প্রোগ্রামারের চাহিদা থাকে। এছাড়া যুক্তির চর্চা আমাদের মত কুসংস্কারাচ্ছন্ন জাতিকে দিতে পারে মুক্তির আশ্বাস।
(একই প্রোগ্রামের জন্য বিভিন্নভাবে অ্যালগরিদম লেখা যেতে পারে, যার মধ্য থেকে এফিশিয়েন্ট অ্যালগরিদম নির্বাচন করতে পারাটা প্রোগ্রামারের দক্ষতা। এ নিয়ে আগামীতে লেখার আশা আছে।)
কম্পিউটার প্রোগ্রামিংয়ে সঠিকভাবে অ্যালগরিদম নির্বাচন করতে পারাটা খুবই জরুরি। গণিতে আমরা দেখি, একটি সমস্যাকে অনেকভাবেই সমাধান করা যায়। কিন্তু সহজ উপায়ে, কম ধাপে, স্বল্পায়াসে সমাধান করাটা গণিতজ্ঞের বিশেষত্ব। প্রোগ্রামিংয়েও একই কথা প্রযোজ্য। আজকের পর্বটিতে শুধু অ্যালগরিদম নিয়েই আলোচনা করা হবে। অ্যালগরিদমই হচ্ছে প্রোগ্রামিংয়ের যৌক্তিক অংশ। প্রোগ্রামিং শিখতে হলে সবার প্রথমে প্রয়োজন যৌক্তিক চেতনা গঠন (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 ভ্যরিয়েবলের সহায়তায় সহজেই কাঙ্খিত ফলাফলটি পাওয়া যাবে।
তাহলে অ্যালগরিদম হতে পারে এরকমঃ
প্রতিটি ভ্যারিয়েবলই নির্দিষ্ট পরিমান মেমোরি দখল করে। প্রথম উপায়ে আমরা সমাধানে পৌঁছেছি ১০টি ভ্যারিয়েবল নিয়ে কাজ করে কিন্তু দ্বিতীয় উপায়ে মাত্র ৪টি ভ্যারিয়েবল ব্যবহার করেই একই ফলাফল পেয়েছি। অর্থাৎ কম মেমোরিকেই দক্ষতার সাথে ব্যবহার করে সমাধান পাওয়া গিয়েছে। তাই দ্বিতীয় উপায়টি দক্ষতর।
এভাবে ন্যুনতম গণনার জটিলতা, কম সময়ে সমস্যা সমাধান, ন্যুনতম মেমোরি ব্যবহার করে দক্ষ অ্যালগরিদম তৈরি করতে হয়।
আলোচিত গুণফলের অ্যালগরিদমগুলোর প্রোগ্রাম লিখতে হলে আমাদের ডেটা স্ট্রাকচার সম্পর্কে জানতে হবে। এ পর্যন্ত আমরা ব্যবহারকারীর কাছ থেকে ইনপুট নিয়ে অ্যালগরিদম লিখেছি। কম্পিউটারের মেমোরিতে সংরক্ষিত ডেটাবেসের জন্য অ্যালগরিদম লিখতে হলেও ডেটা স্ট্রাকচার সম্পর্কে সম্যক ধারণা থাকা জরুরি। সেক্ষেত্রেও অবশ্য অ্যালগরিদম নির্বাচনের কিছু বিচার্য বিষয় থাকে। তাই আমরা ডেটাবেস অ্যালগরিদম, ডেটা স্ট্রাকচার এই বিষয়গুলোতে আগ্রহী হতে পারি।
0 comments:
Post a Comment