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

C++-এ বাইনারি ম্যাট্রিক্সের সারি জোড়া যাদের মধ্যে সর্বোচ্চ বিট পার্থক্য

একটি বাইনারি ম্যাট্রিক্স দেওয়া আছে। যেই দুটি সারির মধ্যে বিট পার্থক্য (Hamming distance) সর্বোচ্চ সেটি বের করতে হবে। ট্রাই (Trie) ডেটা স্ট্রাকচার ব্যবহার করে O(N×M) তে সমাধান করা যায়।

অ্যালগরিদম

  • প্রথম সারিটি ট্রাইতে ইনসার্ট করুন।
  • পরবর্তী প্রতিটি সারির জন্য ট্রাইতে ট্রাভার্স করে সর্বোচ্চ বিট পার্থক্য বের করুন।
  • প בבিটে যদি বিপরীত বিটের চাইল্ড থাকে, সেখানে যান (পার্থক্য বাড়াবে)। নাই তবে সেম বিটের চাইল্ডে যান।
  • সারিটি ইনসার্ট করুন এবং সর্বোচ্চ পার্থক্য ও সারির ইন্ডেক্স আপডেট করুন।

C++ প্রোগ্রাম

#include <bits/stdc++.h>
using namespace std;
const int MAX = 100;

class TrieNode {
public:
    int leaf;
    TrieNode* child[2];
    TrieNode() { leaf = 0; child[0] = child[1] = NULL; }
};

void insert(TrieNode* root, int mat[][MAX], int m, int row) {
    TrieNode* temp = root;
    for (int i = 0; i < m; i++) {
        int bit = mat[row][i];
        if (!temp->child[bit]) temp->child[bit] = new TrieNode();
        temp = temp->child[bit];
    }
    temp->leaf = row + 1;
}

pair<int,int> getMaxBitDiff(TrieNode* root, int mat[][MAX], int m, int row) {
    TrieNode* temp = root;
    int count = 0;
    for (int i = 0; i < m; i++) {
        int bit = mat[row][i];
        if (temp->child[bit]) temp = temp->child[bit];
        else if (temp->child[1-bit]) { temp = temp->child[1-bit]; count++; }
    }
    int leaf_idx = temp->leaf;

    int temp_count = 0; temp = root;
    for (int i = 0; i < m; i++) {
        int bit = mat[row][i];
        if (temp->child[1-bit]) { temp = temp->child[1-bit]; temp_count++; }
        else if (temp->child[bit]) temp = temp->child[bit];
    }
    return (temp_count > count) ? make_pair(temp_count, temp->leaf) : make_pair(count, leaf_idx);
}

void getMaxDiff(int mat[][MAX], int n, int m) {
    TrieNode* root = new TrieNode();
    insert(root, mat, m, 0);
    int maxDiff = INT_MIN;
    pair<int,int> pr, tmp;
    for (int i = 1; i < n; i++) {
        tmp = getMaxBitDiff(root, mat, m, i);
        if (tmp.first > maxDiff) {
            maxDiff = tmp.first;
            pr = {tmp.second, i+1};
        }
        insert(root, mat, m, i);
    }
    cout << "(" << pr.first << ", " << pr.second << ")";
}

int main() {
    int mat[][MAX] = {{1,1,1,1}, {1,0,1,1}, {0,1,0,0}, {1,0,0,0}};
    getMaxDiff(mat, 4, 4);
    return 0;
}

আউটপুট: (2, 3)

  1. বাইনারি ট্রিতে সর্বোচ্চ লেভেল সম বের করা C++-তে

  2. C++-এ বাইনারি ট্রিতে সর্বোচ্চ ও ন্যূনতম মান বের করুন

  3. বাইনারি ট্রিতে সর্বোচ্চ লেভেল প্রোডাক্ট (C++)

  4. বাইনারি ট্রিতে ভার্টিকাল সমের সর্বোচ্চ মান খুঁজে বের করা C++-তে