Introduction to Time and Space Complexity

Introduction to Time and Space Complexity

Rubix's Cube নামটার সাথে আমরা কমবেশি অনেকেই পরিচিত। যেকোনো বয়সের মানুষই এই Puzzle মিলাতে পছন্দ করে। শুরুর দিকে আমরা যখন এটা মিলাতে যাই তখন আমাদেরকে অনেক বেশি প্র্যাকটিস করতে হয়। এক পর্যায়ে দেখা যায় আমরা সেটা মিলাতে সক্ষমও হই। কিন্তু এখানে একটা সমস্যা থেকেই যায়। আমরা এটা মিলাতে গিয়ে প্রচুর সময় নিয়ে ফেলি। এর কারণ কি? মূলত যেই সূত্র ধরে আমরা প্রথম দিকে শিখে থাকি সেটা শেখা অনেক বেশি সহজ হয়ে থাকে। যার কারনে প্রথম দিকে ৩-৪ মিনিট সময় লাগে। হাতে স্পিড চলে আসলে সেটাকে আমরা ১.৫-২ মিনিটের মধ্যে নিয়ে আসি।

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

কিভাবে সম্ভব ভাই?

এবার আসা যাক মূল কথায়। প্রথম দিকে যেই steps বা ধাপ অনুসরণ করা হয়েছিল সেটা অনেক বেশি সময়সাপেক্ষ ছিল। কিন্তু যারা কয়েক সেকেন্ডে মিলিয়ে ফেলছে তাদের এলগরিদম ভিন্ন। সেগুলো অনেক ফাষ্ট কাজ করে। যার দরুন আমরা কয়েক সেকেন্ডে Rubix's Cube মিলিয়ে ফেলতে দেখি।

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

ঠিক ধরেছেন! আমরা প্রোগ্রামিং এর টাইম এবং স্পেস কমপ্লেক্সিটি নিয়ে কথা বলতে যাচ্ছি। আমাদের যাদের টুকটাক knowledge আছে তারা হয়তো কিছু সর্টিং এলগরিদম এর সাথে পরিচিত। যারা জানেন না সর্টিং বলতে কি বুঝাচ্ছে তাদের জন্য বলি, আমাদেরকে ধরেন কিছু random number দেওয়া হলো এবং আমাদেরকে বলা হলো ওই number গুলোকে Ascending অথবা Descending অর্ডারে সাজাতে। এটাই মূলত হচ্ছে সর্টিং। এখন আবার মূল টপিকে আসা যাক। Rubix Cube এর ক্ষেত্রে যেমন আমাদের কাছে অনেকগুলো উপায় আছে সেটাকে মিলানোর যার মধ্যে কিছু অনেক সময় নেয় আবার কিছু অনুসরণ করে কয়েক সেকেন্ডেই মিলিয়ে ফেলা যায় ঠিক তেমনি এখানেও অনেক ধরনের সর্টিং এলগরিদম রয়েছে যার মধ্যে কিছু অনেক সময় নিয়ে থাকে সর্ট করার জন্য আবার কিছু অনেক দ্রুত সর্ট করে ফেলতে পারে।

এখন যে প্রশ্নটা আসতে পারে সেটা হলো আমরা কিভাবে বুঝবো যে কোন এলগরিদম কতটুকু ফাষ্ট বা স্লো? 🤔🤔🤔

এটা আমরা বুঝতে পারি Big O Notation এর মাধ্যমে। আরও ২ ধরনের নোটেশন আছে কিন্তু আপাতত এটা নিয়েই কথা বলা যাক। Big O নোটেশন এর বিভিন্ন মানের মাধ্যমে আমরা বুঝতে পারি একটা এলগরিদম কতটুকু ফাষ্ট বা স্লো।

অনেকের মনেই একটা প্রশ্ন আসতে পারে যে এটা কি আমাদের সেকেন্ডে বা মিনিট বা ঘণ্টা বলে দেয়? যে এই এলগরিদম এত মিনিট সময় নেয়, ওই এলগরিদম এত মিনিট সময় নেয়?

আসলে ব্যাপারটা এমন নয়। কেননা এটা ইনপুট সাইজ এর উপর ডিপেন্ড করে। তাই স্পেসিফিকভাবে কিছু বলা যায়না। এজন্য কিছু স্ট্যান্ডার্ড ফলো করা হয়।

যেমন আমাদেরকে যদি বলা হয় টাইম কমপ্লেক্সিটি O(1) তাহলে আমাদেরকে বুঝে নিতে হবে যে এটা কনস্ট্যান্ট টাইম এর মধ্যে কোনো একটা কাজ করে ফেলতে পারে। আবার যদি বলা হয় টাইম কমপ্লেক্সিটি O(n) তাহলে আমাদেরকে বুঝে নিতে হবে যে এটা লিনিয়ার টাইম এর মধ্যে কোনো একটা কাজ করে ফেলতে পারে। এরকম আরও অনেকগুলো রয়েছে। বাকিগুলো আপনাদের নিজেদের study এর জন্য রেখে দিলাম। গুগল করলে প্রচুর পরিমাণে রিসোর্স পাওয়া যাবে এই টপিকে উপর।

আপাতত যারা এই পর্যন্ত এসেছেন তারা হয়তো বিষয়টাকে ইতিমধ্যেই Realize করতে পেরেছেন। বিশেষ করে শুরুটা Rubix Cube দিয়ে হওয়াতে পুরো বিষয়টাকে একটা Imagination এর মধ্যে নিয়ে আসতে পেরেছেন।

এবার স্পেস কমপ্লেক্সিটি কি সেটা নিয়ে একটু জেনে নেওয়া যাক? সহজভাবে বললে,

Space complexity refers to the total amount of memory space used by an algorithm/program, including the space of input values for execution.

অর্থাৎ এটার মাধ্যমে আমরা বুঝে থাকি যে একটা এলগরিদম এক্সিকিউশন এর সময় এর ইনপুটসহ কি পরিমাণ মেমোরি স্পেস ব্যবহার করছে।

এবার বলুন তো এই কোড এর টাইম এবং স্পেস কমপ্লেক্সিটি কত? কমেন্ট করে জানিয়ে দিন আপনার মূল্যবান মতামত।