মডিউল ১১-৫ঃ কাউন্টিং এরে অর ফ্রিকুয়েন্সি এরে

আমাদের যদি একটি এরেতে জিরো কতবার আছে, ওয়ান কতবার আছে, টু কতবার করে আছে তা কাউন্ট করতে হয় তাহলে আমরা নরমালি এভাবে চিন্তা করতে পারিঃ

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);  // এরে ইনপুট নেওয়া হচ্ছে।
    }
    int zero=0,one=0,two=0;  // জিরো, ওয়ান, টু কাউন্ট করার জন্য তিনটি ভেরিয়েবল নেওয়া হয়েছে।
    for(int i=0;i<n;i++)     // লুপ চালিয়ে সম্পূর্ণ এরে ট্রাভারস করা হচ্ছে।
    {
        if(a[i]==0)          // চেক করা হচ্ছে এরের এলিমেন্টটি জিরো কিনা।
            zero++;          // যদি জিরো হয় তাহলে জিরো ভেরিয়েবল এর মান ১ বাড়িয়ে দেওয়া হচ্ছে।
        if(a[i]==1)          // চেক করা হচ্ছে এরের এলিমেন্টটি ওয়ান কিনা।
            one++;           // যদি ওয়ান হয় তাহলে ওয়ান ভেরিয়েবল এর মান ১ বাড়িয়ে দেওয়া হচ্ছে। 
        if(a[i]==2)          // চেক করা হচ্ছে এরের এলিমেন্টটি টু কিনা।
            two++;           // যদি টু হয় তাহলে টু ভেরিয়েবল এর মান ১ বাড়িয়ে দেওয়া হচ্ছে। 
    }
    printf("O -> %d\n",zero);   // প্রিন্ট করা হচ্ছে 0,1,2 কতবার করে আছে।
    printf("1 -> %d\n",one);
    printf("2 -> %d\n",two);
    return 0;
}

এভাবে করে আমরা করে ফেলত পারি। কিন্তু আমাদের যদি এরেতে সবগুলো এলিমেন্ট কোনটি কতবার করে আছে তা বের করতে হয় তখন কিন্তু আমরা এভাবে করতে পারব না। একটু আগে আমরা যখন 0,1,2 তিনটি সংখ্যা কতবার আছে তা কাউন্ট করতে গিয়েছি তখন আমাদের তিনটি ভেরিয়েবল নিতে হয়েছে এবং তিনবার কন্ডিশন দিয়ে চেক করতে হয়েছে। এখন যদি আমাদের এরেতে ১০০০টি সংখ্যা থাকে এবং আমাদের সবগুলো কতবার করে আছে তা বের করতে হয় তাহলে নিশ্চয়ই আমরা ১০০০টি ভেরিয়েবল এবং ১০০০ বার কন্ডিশন দিয়ে করব না।

এক্ষেত্রে আমরা যেই পদ্ধতিটি ইউজ করতে পারি তা হচ্ছে কাউন্টিং এরে অথবা ফ্রিকুয়েন্সি এরে। যেহেতু এখানে আমাদের অনেকগুলো ভেরিয়েবল নিতে হচ্ছে আর আমরা জানি অনেকগুলো ভেরিয়েবল আমরা একবারে নিয়ে নিতে পারি একটি এরের সাহায্যে। তারপর সেই এরের ০ নম্বর ইন্ডেক্সকে রেখে দিতে পারি ০ কতবার আছে তা কাউন্ট করার জন্য, ১ নম্বর ইন্ডেক্সকে রেখে দিতে পারি ১ কতবার আছে তা কাউন্ট করার জন্য, ২ নম্বর ইন্ডেক্সকে রেখে দিতে পারি ২ কতবার আছে তা কাউন্ট করার জন্য। এভাবে করে আমরা সবগুলো সংখ্যাই কাউন্ট করে ফেলতে পারব। অর্থাৎ যেখানে আমরা ০ পেলে zero++ করতাম, এখন আমরা cnt[0]++ করব।

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);  // এরে ইনপুট নেওয়া হচ্ছে। 
    }
    int cnt[7]={0};         // একটি কাউন্টিং এরে ডিক্লেয়ার করা হচ্ছে ৭ সাইজের। তাহলে এর ইন্ডেক্স হবে ০ থেকে ৬। এই এরে দিয়ে ০ থেকে ৬ পর্যন্ত সবগুলো সংখ্যা কোনটি কতবার আছে তা কাউন্ট করে রাখা যাবে। যেহেতু এখানে আমরা কাউন্ট করছি তাই শুরুতে প্রতিটি ভেলু ০ ইনিশিয়াল করে দেওয়া হয়েছে।
    for(int i=0;i<n;i++)    // লুপ চালিয়ে এরের প্রতিটি ইনডেক্স এক্সেস করা হচ্ছে।
    {
        int val=a[i];       // এরের এলিমেন্টটি বের করা রাখা হচ্ছে আরেকটি ভেরিয়েবলে, পরবর্তীতে কাউন্ট করার জন্য।
        cnt[val]++;         // ভেলুর মান যত কাউন্টিং এরের ওই ইন্ডেক্সে যেয়ে সেটার কাউন্ট এর মান ১ বাড়িয়ে দেওয়া হচ্ছে। এরের এলিমেন্টটি যদি ১ হয় তাহলে কাউন্টিং এরের ১ নম্বর ইন্ডেক্সে যেয়ে তার ভেলু ১ বাড়িয়ে দেওয়া হচ্ছে। এরের এলিমেন্টটি যদি ১০ হয় তাহলে কাউন্টিং এরের ১০ নম্বর ইন্ডেক্সে যেয়ে তার ভেলু ১ বাড়িয়ে দেওয়া হচ্ছে। 
    }
    
    for(int i=0;i<=6;i++)    // এবার কাউন্টিং এরের উপর লুপ চালানো হচ্ছে
    {
        printf("%d - %d\n",i,cnt[i]);  // প্রথমে ইন্ডেক্স প্রিন্ট করা হচ্ছে অর্থাৎ সংখ্যা এবং তারপর সেই ইন্ডেএক্সের মান অর্থাৎ সেই সংখ্যাটি কতবার আছে তা প্রিন্ট করা হচ্ছে।
    }
    return 0;
}

Last updated