অ্যারে ও স্ট্রিংপড়তে ৫ মিনিট লাগবে

স্ট্যাটিক অ্যারে

নম্বর দেওয়া খোপের সারি — সাথে সাথে জিনিস নেওয়া যায়, কিন্তু সাইজ বদলানো যায় না
নম্বর ধরে নেওয়া: তাৎক্ষণিক · O(1)ভিতরের জিনিস খোঁজা: ধীর · O(n)সাইজ বদলানো: সম্ভব নয়

মনে করুন আপনার কাছে নম্বর দেওয়া খোপের একটা সারি আছে — ঠিক যেমন ফার্মেসির ওষুধের তাক বা আলমারির ড্রয়ার। প্রতিটা খোপের একটা নম্বর থাকে, এবং ভেতরে নির্দিষ্ট একটা জিনিসই রাখা যায়।

প্রোগ্রামিংয়ের ভাষায় অ্যারে মানে ঠিক এটাই। পাশাপাশি সাজানেন লম্বা একটা বাক্সের সারি, যেগুলোর গায়ে নম্বর সাঁটানো থাকে। ব্যাপারটি খুবই সহজ!

এই বাক্স বা খোপগুলোকে বলা হয় এলিমেন্ট (Element), আর খোপের গায়ে লেখা নম্বরগুলোকে বলা হয় ইনডেক্স (Index)। তবে একটা খুব গুরুত্বপূর্ণ ব্যাপার হলো: আমরা সাধারণত ১ থেকে গোনা শুরু করলেও কম্পিউটার সবসময় থেকে গোনা শুরু করে। তাই প্রথম খোপটির নম্বর [০], দ্বিতীয়টির [১], আর এভাবেই এগোতে থাকে।

যেকোনো খোপে ক্লিক করুন

← → অ্যারো কি (arrow key) ব্যবহার করুন · উপাদানগুলোতে ক্লিক করুন

যেকোনো খোপ থেকে এত দ্রুত জিনিস নেওয়া যায় কীভাবে?

এর পেছনে আসল ম্যাজিকটা হলো: সবগুলো বাক্স বা খোপ একেবারে একই সাইজের এবং একদম গাঁ ঘেঁষে পাশাপাশি সাজানেন থাকে। এর মানে হলো, কম্পিউটার শুধু একবার হিসাব করেই সরাসরি নির্দিষ্ট নম্বরের খোপের কাছে পৌঁছে যেতে পারে।

আপনার ধরুন ৫ নম্বর খোপের জিনিস লাগবে? কম্পিউটার চট করে হিসাব করে নেয়: "সারিটা শুরু হয়েছে কোথা থেকে সেটা আমি জানি, একেকটা খোপ কত বড় সেটাও আমার জানা — তাহলে ৫ নম্বর খোপটা ঠিক কতটুকু দূরে, তা বের করা তো এক সেকেন্ডের কাজ।" ব্যস, এক হিসাব এবং কাজ শেষ! ৫ নম্বরে যানয়ার জন্য কম্পিউটারকে ১, ২, ৩ বা ৪ নম্বর খোপ হাতড়ে দেখতে হয় না।

এ কারণেই অ্যারে থেকে কোনো কিছু বের করে নেওয়া সাথে সাথে বাঁ চোখের পলকেই হয়ে যায় — অ্যারে যত বিশালই হোক না কেন।

আশেপাশের জিনিসগুলো বোনাস হিসেবে চলে আসে

কম্পিউটার যখন কোনো খোপ থেকে কিছু বের করে, তখন সে আশপাশের আরও কয়েকটা খোপের জিনিসও এমনি এমনি মেমোরিতে নিয়ে আসে — কারণ এগুলো তো একদম গায়ে গা লাগানো থাকে! তাই [০] নম্বর খোপ দেখার সময়, [১], [২], [৩] খোপগুলোও আগে থেকেই রেডি হয়ে থাকে। এ কারণেই অ্যারে ব্যবহার করে পর পর জিনিস খোঁজা বা লুপ (Loop) চালানো অসাধারণ রকমের ফাস্ট

দ্রষ্টব্য: স্ট্যাটিক অ্যারে অনেকটা বাজার থেকে কেনা ডিমের খাঁচার মতো — খাঁচাটা ১ হালি নাকি ১ ডজন ডিমের হবে সেটা কিনার সময়ই ঠিক করতে হয়। একবার কিনে ফেললে, পরে জোড়াতালি দিয়ে আর নতুন ঘরের জায়গা বানানো যায় না!

সবচেয়ে বড় সমস্যা: সাইজ একদম ফিক্সড!

স্ট্যাটিক অ্যারে বানানোর সময়ই আপনাকে কম্পিউটারকে বলে দিতে হবে যে, আপনার ঠিক কয়টা খোপ দরকার। পরে চাইলেই আর খোপ বাড়ানো যায় না — এটা একদম ফিক্সড হয়ে যায়। এই কারণেই একে স্ট্যাটিক অ্যারে বলা হয় (স্ট্যাটিক মানে যা পরিবর্তন করা যায় না)।

আপনি যদি ৮টা খোপের জায়গা নেন, তবে ৮টাই পাবেন। এর মধ্যে ৩টা খোপ ব্যবহার করলে বাকি ৫টা খোপ ফাঁকাই পড়ে থাকবে। আর যদি পুরো ৮টাই ভর্তি হয়ে যায় এবং আপনার হুট করে ৯ নম্বর আরেকটা জিনিসের জায়গা লাগে — তখন আর কোনো উপায় নেই!

(এই ঝামেলা থেকে বাঁচার জন্য ডায়নামিক অ্যারে নামের আরেকটা জিনিস আছে, সেটা আমরা পরে দেখব।)

তাহলে জিনিস খুঁজবেনন কীভাবে?

অ্যারেতে বাক্সের নম্বর জানা থাকলে তো সরাসরি যানয়া যায়, কিন্তু কোনো নির্দিষ্ট জিনিস বা ভ্যালু খুঁজতে গেলে সেটা অনেক সময়সাপেক্ষ। ধরুন আপনি অ্যারেতে ৫৫ সংখ্যাটা খুঁজছেন। তাহলে কম্পিউটারকে আগে [০] নম্বর খোপ খুলে দেখতে হবে—৫৫ আছে কিনা—নেই। এরপর [১] নম্বর খোপ—আছে কিনা—নেই। যতদিন না ৫৫ পাওয়া যাচ্ছে, এভাবে খুঁজতেই হবে। আর সবচেয়ে খারাপ অবস্থা বা Worst Case হলো, যদি জিনিসটা একদম শেষের বাক্সে থাকে, তবে কম্পিউটারকে সব খুঁজে খুঁজে ক্লান্ত হতে হবে।

Complexity

🎯 নম্বর ধরে জিনিস নেওয়া
সাইজ যাই হোক, মাত্র একটা ধাপ
সাথে সাথে O(1)
🔍 কোনো নির্দিষ্ট জিনিস খোঁজা
একটা একটা করে খুলে দেখতে হয়
স্লো O(n)
➕ একেবারে শেষে যোগ করা
খালি জায়গা থাকলে
সাথে সাথে O(1)
🔀 মাঝখানে কোনো কিছু ঢোকানো
পরের সব জিনিসকে এক ঘর করে সরাতে হয়
স্লো O(n)
🗑️ মাঝখান থেকে কোনো কিছু মুছে ফেলা
পরের জিনিসগুলোকে টেনে পেছনে আনতে হয়
স্লো O(n)

অ্যারে কখন ব্যবহার করবেন?

  • যখন আপনি আগে থেকেই জানেন আপনার ঠিক কয়টা জায়গা লাগবে।
  • যখন বেশিরভাগ সময় আপনি নম্বর (ইনডেক্স) ধরে ঘপাঘপ জিনিস তুলবেন।
  • যখন সবগুলোর ওপর দিয়ে দ্রুত লুপ বা ইটারেট করতে চান।
  • যখন ভবিষ্যতে সাইজ বাড়ানোর কোনো দরকার পড়বে না।

একটা ছাড় তো দিতেই হবে

অ্যারের সবচেয়ে বড় দুর্বলতা হলো ওই ফিক্সড সাইজটা। যদি আপনি না জানেন যে সামনে আপনার কয়টা জিনিস রাখার জায়গা লাগতে পারে, তবে আপনার ডায়নামিক অ্যারে (Dynamic Array) ব্যবহার করা উচিত — ওটা দরকারে রাবারের মতো বাড়তে পারে।

Challenge

ছোট কুইজ

আপনার কাছে ১০০টা খোপের একটা অ্যারে আছে। এখন [৯৯] নম্বর খোপ থেকে কিছু বের করতে কয়টা ধাপ লাগবে?

পড়া চালিয়ে যান

ডায়নামিক অ্যারে (Dynamic Array)
এমন একটা অ্যারে, যার জায়গা ফুরিয়ে গেলে নিজে নিজেই বড় হয়ে যায়
টু পয়েন্টার (Two Pointers)
অ্যারের উপর দিয়ে দুই আঙুল চালিয়ে এক চান্সেই সমস্যার সমাধান করা
প্রিফিক্স সাম (Prefix Sums)
আগে থেকেই যোগফল হিসাব করে রাখা, যাতে যেকোনো সাব-অ্যারের যোগফল চোখের পলকে O(1) স্পিডে বের করা যায়
ArraysJava
Fixed-size boxes — declare, fill, and loop