পোস্টটি পড়া হয়েছে 3,284 বার
Data Structure in Bengali

অ্যারে (Array): সবচেয়ে সহজ ডেটা স্ট্রাকচার – ১

এই সিরিজের প্রথম পোস্ট থেকে ইতমধ্যেই তোমরা জেনে গেছ ডেটা স্ট্রাকচার বলতে আসলে কী বুঝায়। আর ডেটা স্ট্রাকচার আমাদের কেনই বা শিখতে হবে?

তোমাকে বলা হল ৩ জন ছাত্রের বয়স ইনপুট নিয়ে তাদের গড় বের করতে। তুমি age0, age1, age2 নামের তিনটি int type এর ভ্যারিয়েবল ডিক্লেয়ার করলে। এরপর তাতে ইনপুট নিলে নিচের মত করেঃ

এরপর এদেরকে যোগ করে ৩ দিয়ে ভাগ করে গড় বের করলে। এ পর্যন্ত করাতে কোন সমস্যা নাই।

সমস্যা শুরু হবে যদি বলি কোন ক্লাসের সবার বয়স ইনপুট নিয়ে স্টোর কর। তাদের বয়সের গড় প্রিন্ট কর। তখন ১০০ জন ছাত্রের জন্য age0, age1, age2,…, age99 পর্যন্ত এত্তগুলা variable declare করে এরপর তাতে ইনপুট নিয়ে যোগ করে গড় বের করা কিন্তু কোন সহজ কাজ নয়।

চিন্তা করো, যদি এমন একটা সিসটেম করা যেত যে একটা ভ্যারিয়েবলের নাম রাখব ধরো age. এই age এর সাথে ছাত্রদের রোল নম্বর দিয়ে যার যার বয়স ইনপুট দিয়ে রাখ। অর্থাৎ প্রথমে যেই কাজটা করতে চাচ্ছিলাম সেটাই করব তবে অটোমেটিক ভাবে। age0, age1, age2… আলাদা আলাদা ভাবে ডিক্লেয়ার করে আলাদা আলাদা লাইনে ইনপুট নিতে হবে না। এই সিসটেমটার নামই হচ্ছে অ্যারে (Array).

Array: A Linear Data Structure

দুই ধরণের ডেটা স্ট্রাকচার রয়েছে। একটা হচ্ছে Linear Data Structure, আরেকটি হচ্ছে Nonlinear Data Structure.

লিনিয়ার ডেটা স্ট্রাকচার হচ্ছে এমন এক ধরণের স্ট্রাকচার যা মেমরিতে sequence অনুযায়ী স্টোর হয়। এই স্ট্রাকচারের ডেটাগুলো একটার পর একটা সিরিয়াল্যি সাজানো থাকে। এই লিনিয়ার ডেটা স্ট্রাকচারের দুই ধরনের representation রয়েছে। একটা হচ্ছে Array. সোজা সাপটা ভাবে একই ডেটা টাইপের (int, float, double, char) ডেটাগুলো লাইন ধরে সাজানো থাকে অ্যারের মধ্যে। আরেকটা রিপ্রেজেন্টেশন হচ্ছে, লিস্টের element-গুলোর মধ্যকার সম্পর্ক। এর উদাহরন হচ্ছে Linked List.

নন লিনিয়ার ডেটা স্ট্রাকচারের উদাহরণ হিসেবে উল্লেখ করা যায় Tree স্ট্রাকচারের কথা। Tree-তে অ্যারের মত সিরিয়াল্যি ডেটা সাজানো থাকে না বা সম্ভবও না। কারণ এখানে root, শাখা-প্রশাখা ইত্যাদির হিসাব-নিকাশ রয়েছে।

অ্যারেকে এক কথায় সংজ্ঞায়িত করতে চাইলে এভাবে বলা যায়, নির্দিষ্ট সংখ্যক ডেটা স্টোর করার জন্য একটা স্ট্রাকচার যেখানে শুধুমাত্র এক ধরণের ডেটাই সংরক্ষণ করা যায়। অর্থাৎ অ্যারের একটা নির্দিষ্ট সাইজ থাকবে। এই সাইজের চেয়ে বেশি ডেটা কোন অ্যারে স্টোর করতে পারবে না। আর একই ধরণের ডেটাই স্টোর করতে হবে। int type ডেটা স্টোর করতে চাইলে সেই অ্যারেতে শুধুমাত্র int type এর ডেটাই স্টোর করা যাবে। সেখানে int, float, double, char ইত্যাদি মিক্স করে স্টোর করা যাবে না। যদি int type একটা ১০০ সাইজের অ্যারে ডিক্লেয়ার করি তাহলে এই অ্যারেতে সর্বোচ্চ ১০০ টা int-ই স্টোর করা যাবে।

যে কোন ডেটা স্ট্রাকচারেই data insert, traverse, update, delete, searching, sorting এর মত ব্যাসিক কিছু কাজ থাকে। এই পোস্টে অ্যারের Declaration, Insertion, Traverse এই অপারেশনগুলো দেখানোর চেষ্টা করা হবে।

Array Declaration

প্রোগ্রামিং ল্যাঙ্গুয়েজ ভেদে অ্যারের ডিক্লেয়ারেশন একটু এদিক সেদিক হয়ে থাকে। এক্ষেত্রে সি প্রোগ্রামিং ল্যাঙ্গুয়েজে অ্যারের সকল অপারেশনগুলো দেখাবো। সি এর কোড বুঝলে যে কোন ল্যাঙ্গুয়েজেই অ্যারে ইমপ্লিমেন্ট করা যাবে।

সর্বোচ্চ ১০০ জন ছাত্রের বয়স যদি আমাদের স্টোর করে প্রসেস করার দরকার হয় সেক্ষেত্রে আমরা অ্যারেটা ডিক্লেয়ার করতে পারি নিচের মত করেঃ

int হচ্ছে ডেটা টাইপ। ধরে নিলাম বয়স হিসেবে শুধু পূর্ণ সংখ্যাই ইনপুট দেয়া হবে। তাই এখানে int টাইপের অ্যারে নিয়েছি। যদি ভগ্নাংশ নিয়ে কাজ করার দরকার হয় সেক্ষেত্রে float বা double ডেটা টাইপের অ্যারে ডিক্লেয়ার করতে হবে। এই অ্যারেতে সর্বোচ্চ ১০০ টি পূর্ণ সংখ্যা স্টোর করা যাবে।

array
Array Representation. Photo Credit: www.java67.com/

Array Initialization (insert)

প্রথমত দেখি যদি কিছু ফিক্সড ভ্যালু অ্যারেতে স্টোর করতে চাই তাহলে কিভাবে করা যায়।

উপরে দেখা যাচ্ছে age নামক অ্যারের প্রথম ইন্ডেক্সে একটা ভ্যালু (45) assign করা হয়েছে। age[0] অ্যারেটির প্রথম ইন্ডেক্স। সব ল্যাঙ্গুয়েজেই অ্যারের ইন্ডেক্সিং শুরু হয় শূণ্য থেকে। সি ল্যাঙ্গুয়েজে অ্যারের প্রতিটা ইন্ডেক্স অ্যাক্সেস করতে হয় অ্যারের নাম দিয়ে এরপর 3rd bracket এর ভিতরে ইন্ডেক্সের নাম্বার লিখে। age অ্যারের সর্বশেষ ইন্ডেক্স হচ্ছে ৯৯। সর্বশেষ ইন্ডেক্স বা অ্যারের সর্বশেষ খোপে যদি কোন মান অ্যাসাইন করতে চাই তাহলে লিখতে হবে এভাবেঃ age[99] = 65;

একটা বিষয় লক্ষ্যনীয়, অ্যারের ইন্ডেক্স নাম্বার আর অ্যারের ইন্ডেক্সের ভ্যালু কিন্তু ভিন্ন জিনিস। age[1] = 17; বলতে বুঝায় age নামক অ্যারেতে যতগুলো ইন্ডেক্স বা খোপ আছে তাদের মধ্য থেকে ১ নাম্বার খোপে ১৭ মানটা বসিয়ে দাও। ১ হচ্ছে খোপের নাম্বার। এই নাম্বারিং এর মাধ্যমেই কিন্তু আমরা লিনিয়ার অ্যারে ইমপ্লিমেন্ট করতে পারছি। ০, ১, ২, ৩, … এভাবে এই খোপের সংখ্যাগুলো বাড়ছে। আর ১৭ হচ্ছে ছাত্রের বয়স। যেটা অরিজিনাল ডেটা বা ভ্যালু। এক কথায় বললে ১৭ ভ্যালুটাকে age অ্যারের 1 নাম্বার ইন্ডেক্সে বসানোর জন্য age[1] = 17; লিখতে হবে। আশা করি ইন্ডেক্স নাম্বার আর ইন্ডেক্স ভ্যালু গুলিয়ে ফেলবে না আর।

এখন দেখব সি ল্যাঙ্গুয়েজ দিয়ে একটা অ্যারেতে কিভাবে ইনপুট নিতে হয়। অ্যারে নিয়ে কাজ করতে গেলে Loop এর পরিষ্কার ধারণা থাকতে হবে। যদি লুপের মধ্যে ঝামেলা থাকে তাহলে উচিত হবে লুপটা একটু রিভাইস দিয়ে এসে বাকি লেখাটা পড়া।

তোমরা চাইলে ম্যারাথন স্টাইলে ইনপুট নিতে পারো কোন রকমের লুপের ইউজ ছাড়াই।

কিন্তু উপরের সিসটেমে কেউ অ্যারেতে ইনপুট করে না। লুপের মাধ্যমেই ইনপুট করতে হয়। আমরা নিচে নির্দিষ্ট সংখ্যক ছাত্রের বয়স ইনপুট দেয়ার জন্য কোড লিখব। number_of_student একটি int type variable. এতে ইনপুট নেয়া হচ্ছে কতজন ছাত্রের বয়স ইনপুট নেয়া হবে।

উপরের কোডে লুপের ভিতর ইনপুট নেয়ার কাজ চলতে থাকবে। একদম শুরুতে অ্যারের প্রথম ইন্ডেক্স 0-তে ইনপুট হবে। এরপর 1, 2, … (number_of_student-1) পর্যন্ত সবগুলো ইন্ডেক্সে ইনপুট হবে।

সব সময় যে সিরিয়াল্যি সবগুলো ইন্ডেক্সেই মান ইনপুট নিতে হবে এমন না। তুমি চাইলে এক ঘর বাদ দিয়ে দিয়েও ইনপুট নিতে পারো। যেমনঃ age[0], age[2], age[4]… এগুলোতে ইনপুট নিবে, কিন্তু বাকিগুলোতে নিবে না। এখানে তোমাকে ইনপুট নেয়া শেখানো হল। পরবর্তীতে কখন কিভাবে কী কাজে লাগাতে হবে সেটা তুমি সিদ্ধান্ত নিবা।

Array Traversing

তুমি ১০০ সাইজের একটা অ্যারে ডিক্লেয়ার করলা। এরপর তাতে কিছু ডেটা রাখলা এরপর কাজ কী? এরপর হয় তোমাকে সেই ডেটাগুলো প্রিন্ট করতে হবে, বা নির্দিষ্ট কোন ডেটার উপর নির্দিষ্ট কোন কাজ করা লাগতে পারে। কোন একটা ডেটা সার্চ করার দরকার হতে পারে অথবা কোন একটা শর্ত অনুযায়ী ডেটাগুলোকে সাজানো লাগতে পারে। এর মানে হচ্ছে তোমার মেমরি সংরক্ষিত ডেটাগুলোতে তুমি অ্যাক্সেস করবে বা ডেটাগুলোর উপর তুমি ভ্রমণ (traverse) করবে।

যেভাবে লুপ চালিয়ে প্রতিটা ইন্ডেক্সে ইনপুট নিয়েছিলাম, একই ভাবে লুপ চালিয়ে প্রতিটা ইন্ডেক্সে ট্রাভার্স করতে পারি। এই ট্রাভার্সের মাধ্যমে চাইলে কোন ডেটা প্রিন্ট করতে পারি, কোন ডেটার সাথে অ্যারিথমেটিক কোন অপারেশন ঘটাতে পারি। কোন ডেটা মুছে দিতে পারি ইত্যাদি।

এখন সবগুলো ইন্ডেক্সের ভ্যালুগুলো একেকটা লাইনে প্রিন্ট করতে চাইলে নিচের কোডটা লিখা যায়ঃ

তাহলে age অ্যারের 0-তম ইন্ডেক্স থেকে (number_of_student – 1)-তম ইন্ডেক্স পর্যন্ত সবগুলো ইন্ডেক্সের ভ্যালু পরপর লাইনে প্রিন্ট করে দিবে। যদি শেষ থেকে শুরুর element-গুলো প্রিন্ট করতে চাও তাহলে লুপটাকে একটু মডিফাই করলেই কাজ করবে। যথাঃ for(i = number_of_student – 1; i>=0; i–){}. অর্থাৎ অ্যারের শেষ ইন্ডেক্স থেকে প্রথম ইন্ডেক্সের সবগুলো মান প্রিন্ট হবে।

তুমি ইচ্ছা করলে নির্দিষ্ট একটা ইন্ডেক্সের ভ্যালুও ইন্ডেক্স নাম্বারের সাহায্যে প্রিন্ট করতে পারোঃ

উপরের কোডে age array এর 3 নাম্বার ইন্ডেক্সের মানটা প্রিন্ট হবে।

কখনো যদি এমন হয় যে ইউজার লুপ ঘুরিয়ে ১০ টি ইন্ডেক্সের নাম্বার ইনপুট দিবে। যেই ইন্ডেক্সের নাম্বার ইনপুট দিবে সেই ইন্ডেক্সের ভ্যালু প্রিন্ট করতে হবে। তাহলে কী করবা?

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

সব ছাত্রের বয়সের গড় বের করতে চাইলে কী করতে হবে? ধরো প্রথমে অ্যারেতে ইনপুট নেয়া হল। এরপর অ্যারেতে লুপ চালিয়ে ট্রাভার্স করব। প্রতিটা ইন্ডেক্সের ভ্যালু যোগ করব এরপর number_of_student দিয়ে ভাগ করব।

দীর্ঘ এই পোস্টের মাধ্যমে অ্যারে ডিক্লেয়ার করা, তাতে ভ্যালু অ্যাসাইন বা ইনপুট করা ও ভ্যালুগুলোতে ট্রাভার্স করার ব্যাপারে বিস্তারিত আলোচনা করার চেষ্টা করেছি। পরের পর্বে আলোচনা করব অ্যারের ভ্যালু আপডেট, ডিলেট, সার্চ, সর্ট ইত্যাদি নিয়ে।

কোথাও কোন ভুল পরীলক্ষিত হলে বা কোন পরামর্শ থাকলে কমেন্ট করার অনুরোধ রইলো। ধন্যবাদ। 🙂

5 thoughts on “অ্যারে (Array): সবচেয়ে সহজ ডেটা স্ট্রাকচার – ১

  1. ভাইয়া এইটা যেহেতু আপনার রাফ খাতা সেহেতু আপনি পারলে আর একটু কষ্ট করে আরো রাফ ভাবে লিখলে আমার মতো মানুষদের বুঝতে অনেক বেশি সুবিধা হতো, তবে আপনি যে এতো সুন্দর করে বাংলাতে লেখেন তার জন্য অনেক অনেক ধন্যবাদ।

    1. আপনার মন্তব্যের জন্য ধন্যবাদ। 🙂
      যতটা বিস্তারিত লেখা যায় চেষ্টা করছি। কোন পয়েন্ট বা কোন প্যারার ব্যাখ্যায় অস্পষ্টতা রয়ে গেছে সেটা যদি কাইন্ডলি একটু ধরিয়ে দেন তাহলে আমার বুঝতে সুবিধা হবে।

  2. aitate problem ta bojte parsi na.help plz…….

    1. Find the differences:

Leave a Reply

Your email address will not be published. Required fields are marked *