কম্পিউটার টিউটোরিয়াল

C#-এ ২D অ্যারেতে K-তম স্মলেস্ট এলিমেন্ট বের করা

প্রশ্নের শিরোনামে "২D অ্যারে" বলা হয়েছে কিন্তু উদাহরণে ১D অ্যারে ব্যবহার করা হয়েছে। নিচে দুটি কেসই আলোচনা করা হলো।

কেস ১: ১D অ্যারেতে K-তম স্মলেস্ট (মূল উদাহরণ)

using System;

namespace Program
{
    class Demo
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 65, 45, 32, 97, 23, 75, 59 };
            int k = 5; // ৫ম স্মলেস্ট
            
            Array.Sort(a); // আরোহী ক্রমে সর্ট
            
            Console.WriteLine("সর্ট করা অ্যারে:");
            foreach (int val in a)
                Console.WriteLine(val);
            
            // K-তম স্মলেস্ট = ইনডেক্স (k-1)
            Console.WriteLine($"\n{k}তম স্মলেস্ট এলিমেন্ট = {a[k - 1]}");
        }
    }
}

আউটপুট

সর্ট করা অ্যারে:
23
32
45
59
65
75
97

৫তম স্মলেস্ট এলিমেন্ট = 65

কেস ২: আসল ২D অ্যারেতে K-তম স্মলেস্ট

using System;
using System.Linq;

public class KthSmallest2D
{
    public static void Main()
    {
        // ২D অ্যারে (ম্যাট্রিক্স)
        int[,] matrix = 
        {
            { 10, 20, 30 },
            { 15, 25, 35 },
            { 27, 29, 37 }
        };
        
        int k = 5;
        
        // ২D অ্যারেকে ১D-এ ফ্ল্যাটেন করুন
        int totalElements = matrix.Length;
        int[] flatArray = new int[totalElements];
        int index = 0;
        
        for (int i = 0; i < matrix.GetLength(0); i++)
        {
            for (int j = 0; j < matrix.GetLength(1); j++)
            {
                flatArray[index++] = matrix[i, j];
            }
        }
        
        // সর্ট করুন
        Array.Sort(flatArray);
        
        Console.WriteLine("ফ্ল্যাটেন করা এবং সর্ট করা অ্যারে:");
        Console.WriteLine(string.Join(", ", flatArray));
        
        if (k >= 1 && k <= flatArray.Length)
        {
            Console.WriteLine($"\n{k}তম স্মলেস্ট এলিমেন্ট = {flatArray[k - 1]}");
        }
        else
        {
            Console.WriteLine("অবৈধ K ভ্যালু!");
        }
    }
}

আউটপুট (২D কেস)

ফ্ল্যাটেন করা এবং সর্ট করা অ্যারে:
10, 15, 20, 25, 27, 29, 30, 35, 37

৫তম স্মলেস্ট এলিমেন্ট = 27

অপ্টিমাইজড পদ্ধতি: QuickSelect (O(n) গড়ে)

পুরো অ্যারে সর্ট না করে শুধু K-তম এলিমেন্ট বের করার জন্য QuickSelect অ্যালগরিদম ব্যবহার করা যায়।


public static int QuickSelect(int[] arr, int k)
{
    // k ১-ভিত্তিক, ইনডেক্স ০-ভিত্তিক
    return QuickSelectHelper(arr, 0, arr.Length - 1, k - 1);
}

private static int QuickSelectHelper(int[] arr, int left, int right, int k)
{
    if (left == right) return arr[left];
    
    int pivotIndex = Partition(arr, left, right);
    
    if (k == pivotIndex)
        return arr[k];
    else if (k < pivotIndex)
        return QuickSelectHelper(arr, left, pivotIndex - 1, k);
    else
        return QuickSelectHelper(arr, pivotIndex + 1, right, k);
}

private static int Partition(int[] arr, int left, int right)
{
    int pivot = arr[right];
    int i = left;
    
    for (int j = left; j < right; j++)
    {
        if (arr[j] <= pivot)
        {
            Swap(arr, i, j);
            i++;
        }
    }
    Swap(arr, i, right);
    return i;
}

private static void Swap(int[] arr, int i, int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

LINQ ব্যবহার করে সংক্ষিপ্ত সমাধান


using System.Linq;

int kthSmallest = arr.OrderBy(x => x).ElementAt(k - 1);

// ২D অ্যারের জন্য
int kthSmallest2D = matrix.Cast<int>().OrderBy(x => x).ElementAt(k - 1);

পারফরম্যান্স তুলনা

পদ্ধতিটাইম কমপ্লেক্সিটিস্পেসব্যবহার
Full SortO(n log n)O(1) বা O(n)সহজ, ছোট অ্যারের জন্য
QuickSelectO(n) গড়ে, O(n²) ওয়ার্স্টO(1)বড় অ্যারে, শুধু K-তম দরকার হলে
Heap (PriorityQueue)O(n log k)O(k)স্ট্রিমিং ডেটা / K ছোট হলে
LINQ OrderByO(n log n)O(n)প্রোটোটাইপিং, পঠনীয়তা
  1. পাইথনে সোর্টেড ইউনিক অ্যারে-এ nums[i] == i হলে স্মলেস্ট ইন্ডেক্স বের করার প্রোগ্রাম (O(log n))

  2. পাইথন প্রোগ্রাম অ্যারেতে সবচেয়ে বড় এলিমেন্ট বের করা

  3. পাইথনে অ্যারে থেকে সর্বোচ্চ এলিমেন্ট বের করা

  4. পাইথন প্রোগ্রাম: ২ডি অ্যারে-তে k-তম ছোট এলিমেন্ট বের করা