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

C++ ব্যবহার করে দুটি বাইনারি ম্যাক্স হিপ মার্জ করা

সমস্যা বিবরণ

দুটি বাইনারি ম্যাক্স হিপ অ্যারে হিসেবে দেওয়া আছে। এদের একসাথে মার্জ করে একটি ম্যাক্স হিপ বানান।

Heap1[] = {20, 17, 15, 10}
Heap2[] = {19, 13, 7}
Result[] = {20, 19, 15, 13, 17, 7, 10}

এলগরিদম

1. ফলাফল সংরক্ষণের জন্য একটি অ্যারে তৈরি করুন
2. দুটি দেওয়া অ্যারেক একে একে রেজাল্ট অ্যারেতে কপি করুন
3. পুরো মার্জড ম্যাক্স হিপ বানাতে হিপ বিল্ড করুন

উদাহরণ কোড

#include <iostream>
#include <algorithm>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;

void heapify(int *arr, int n, int idx) {
    if (idx >= n) {
        return;
    }
    int l = 2 * idx + 1;
    int r = 2 * idx + 2;
    int max;
    if (l < n && arr[l] > arr[idx]) {
        max = l;
    } else {
        max = idx;
    }
    if (r < n && arr[r] > arr[max]) {
        max = r;
    }
    if (max != idx) {
        swap(arr[max], arr[idx]);
        heapify(arr, n, max);
    }
}

void createMaxHeap(int *arr, int n) {
    for (int i = n / 2 - 1; i >= 0; --i) {
        heapify(arr, n, i);
    }
}

void mergeMaxHeaps(int *arr1, int n1, int *arr2, int n2, int *result) {
    merge(arr1, arr1 + n1, arr2, arr2 + n2, result);
    createMaxHeap(result, n1 + n2);
}

void displayHeap(int *arr, int n) {
    for (int i = 0; i < n; ++i) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main() {
    int heap1[] = {20, 17, 15, 10};
    int heap2[] = {19, 13, 7};
    int result[SIZE(heap1) + SIZE(heap2)];
    cout << "First max heap: " << endl;
    displayHeap(heap1, SIZE(heap1));
    cout << "Second max heap: " << endl;
    displayHeap(heap2, SIZE(heap2));
    mergeMaxHeaps(heap1, SIZE(heap1), heap2, SIZE(heap2), result);
    cout << "Merged max heap: " << endl;
    displayHeap(result, SIZE(result));
    return 0;
}

আউটপুট

প্রোগ্রাম কম্পাইল ও এক্সিকিউট করলে নিচের আউটপুট পাওয়া যাবে:

First max heap: 20 17 15 10
Second max heap: 19 13 7
Merged max heap: 20 19 15 13 17 7 10
  1. দুই বাইনারি ট্রি মার্জ (মার্জ) করা C++-এ

  2. C++-এ RMQ ব্যবহার করে বাইনারি ট্রিতে LCA (Lowest Common Ancestor) বের করুন

  3. C++-এ একটি রেখায় সর্বোচ্চ পয়েন্ট (Max Points on a Line)

  4. C++-এ দুটি বাইনারি ট্রি মার্জ করা