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

সি++ প্রোগ্রাম: অনসর্টেড অ্যারেতে kটি নিকটতম সংখ্যা খুঁজে বের করা


একটি অনসর্টেড (unsorted) অ্যারে A দেওয়া থাকলে, দুটি মান X এবং k দেওয়া থাকলে, অ্যারেতে থেকে X-এর নিকটতম k সংখ্যক উপাদান বের করতে হবে। যদি X অ্যারেতে থাকে, তবে আউটপুটে দেখানো হবে না। A = [48, 50, 55, 30, 39, 35, 42, 45, 12, 16, 53, 22, 56], X = 35, k = 4 হলে আউটপুট: 30, 39, 42, 45।

সমাধান: হিপ (heap) ডেটা স্ট্রাকচার ব্যবহার করা হবে। ধাপগুলো:

  • প্রথম k উপাদানের পার্থক্য (difference) দিয়ে একটি ম্যাক্স-হিপ (max-heap) তৈরি করা

  • k+1 তম উপাদান থেকে প্রতিটি উপাদানের জন্য:

    • বর্তমান উপাদান এবং X-এর পার্থক্য বের করা

    • যদি পার্থক্য হিপের রুট (root) থেকে বড় হয়, তবে বর্তমান উপাদান উপেক্ষা করা

    • অন্যথায় রুট সরিয়ে বর্তমান উপাদান হিপে ঢুকানো

  • শেষে হিপে kটি নিকটতম উপাদান পাওয়া যাবে

উদাহরণ

#include <iostream> #include<queue> using namespace std; void findKClosestNumbers(int arr[], int n, int x, int k) {    priority_queue > priorityQ;    for (int i = 0; i < k; i++)       priorityQ.push({ abs(arr[i] - x), i });    for (int i = k; i < n; i++) {       int diff = abs(arr[i] - x);       if (diff > priorityQ.top().first)          continue;       priorityQ.pop();       priorityQ.push({ diff, i });    }    while (priorityQ.empty() == false) {       cout << arr[priorityQ.top().second] << " ";       priorityQ.pop();    } } int main() {    int arr[] = {48, 50, 55, 30, 39, 35, 42, 45, 12, 16, 53, 22, 56};    int x = 35, k = 5;    int n = sizeof(arr) / sizeof(arr[0]);    findKClosestNumbers(arr, n, x, k); }

আউটপুট

45 42 30 39 35

  1. C++-তে অ্যারেতে থাকা সব প্রাইম নম্বরের গুণফল বের করা

  2. সি++ প্রোগ্রাম: অ্যারেতে প্রতিটি উপাদানের জন্য সবচেয়ে নিকটবর্তী বড় মান (Closest Greater Value) খুঁজে বের করা

  3. C++ প্রোগ্রাম: অ্যারে উপাদানগুলোর গুণফলের প্রথম ডিজিট বের করা

  4. C++ প্রোগ্রাম: মিডিয়ানের কাছে k সংখ্যা খুঁজে বের করা (S হল n সংখ্যার সেট)