কম্পিউটার

C++ এ এন-আরি ট্রিকে সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করুন


ধরুন আমাদের একটি এন-আরি গাছ আছে এবং আমাদের সেগুলিকে সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করতে হবে। আমরা জানি যে সিরিয়ালাইজেশন হল একটি ডেটা স্ট্রাকচার বা বস্তুকে বিটগুলির একটি ক্রমানুসারে রূপান্তর করার প্রক্রিয়া যাতে আমরা সেগুলিকে একটি ফাইল বা মেমরি বাফারে সংরক্ষণ করতে পারি এবং এটি একই বা অন্য কম্পিউটার পরিবেশে পরে পুনর্গঠন করা যেতে পারে।

এখানে আমাদের একটি এন-আরি ট্রিকে সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করার জন্য একটি অ্যালগরিদম তৈরি করতে হবে। এন-আরি গাছ হল একটি শিকড়যুক্ত গাছ যার প্রতিটি নোডের মধ্যে N-এর বেশি সন্তান নেই৷

সুতরাং, যদি ইনপুট মত হয়

C++ এ এন-আরি ট্রিকে সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করুন

তারপর আউটপুট হবে সিরিয়ালাইজ:1 #3 2 4 #5 6 ##### এবং ডিসিরিয়ালাইজড ট্রি:1[3[5, 6, ], 2, 4,

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি ফাংশন createVector() সংজ্ঞায়িত করুন, এটি s,

    লাগবে
  • একটি 2D অ্যারে ret সংজ্ঞায়িত করুন

  • একটি অ্যারে tempv সংজ্ঞায়িত করুন

  • temp :=খালি স্ট্রিং

  • আরম্ভ করার জন্য i :=0, যখন i

    • যদি s[i] ফাঁকা স্থানের সমান না হয় এবং s[i] '#' এর সমান না হয়, তাহলে −

      • temp :=temp + s[i]

    • অন্যথায় যখন s[i] ফাঁকা স্ট্রিং এর মত হয়, তখন −

      • tempv

        -এর শেষে temp s পূর্ণসংখ্যা সন্নিবেশ করান
      • temp :=খালি স্ট্রিং

    • অন্যথায় যখন s[i] '#' এর মত হয়, তখন −

      • ret-এর শেষে tempv সন্নিবেশ করুন

      • temp :=খালি স্ট্রিং

      • সাফ tempv

  • যখন (ret খালি নয় এবং ret এর শেষ উপাদানটি 0 এর মতো), করুন −

    • ret

      থেকে শেষ উপাদান মুছুন
  • রিটার্ন রিটার্ন

  • একটি ফাংশন serialize(), এটি রুট নেবে,

    সংজ্ঞায়িত করুন
  • ret :=খালি স্ট্রিং

  • যদি রুট অ-শূন্য হয়, তাহলে −

    • রিটার্ন রিটার্ন

  • একটি সারি q

    সংজ্ঞায়িত করুন
  • q

    -এ রুট সন্নিবেশ করান
  • rret :=ret concatenate val of root

  • ret :=ret concatenate space

  • ret :=ret concatenate "#"

  • যখন (q খালি নয়), −

    করুন
    • curr =q

      এর প্রথম উপাদান
    • q

      থেকে উপাদান মুছুন
    • আরম্ভ করার জন্য i :=0, যখন i

      • যদি শিশু [i] curr এর হয়, তাহলে -

        • ret :=ret concatenate Children[i] of curr

        • q

          এ curr-এর বাচ্চাদের[i] সন্নিবেশ করান
      • ret :=ret + ফাঁকা স্ট্রিং

    • ret :=ret concatenate "#"

  • রিটার্ন রিটার্ন

  • একটি ফাংশন deserialize(), এটি ডেটা নেবে,

    সংজ্ঞায়িত করুন
  • যদি ডেটার আকার 0 এর মতো হয়, তাহলে −

    • রিটার্ন নাল

  • একটি 2D অ্যারে সংজ্ঞায়িত করুন v :=createVector(data)

  • ret :=v[0, 0]

    মান সহ নতুন নোড
  • একটি সারি q

    সংজ্ঞায়িত করুন
  • q

    -এ ret ঢোকান
  • i :=1

  • যখন (q খালি নয় এবং i − আকার v এর), −

    করুন
    • curr =q

      এর প্রথম উপাদান
    • q

      থেকে উপাদান মুছুন
    • j শুরু করার জন্য :=0, যখন j − আকার v[i], আপডেট করুন (j 1 দ্বারা বাড়ান), করবেন −

      • নোড :=v[i, j]

      • temp =মান নোড সহ নতুন নোড

      • curr এর বাচ্চাদের শেষে temp সন্নিবেশ করুন

      • q

        -এ তাপমাত্রা সন্নিবেশ করান
    • (i 1 দ্বারা বাড়ান)

  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
   int val;
   vector<Node*> children;
   Node() {}
   Node(int _val) {
      val = _val;
   }
   Node(int _val, vector<Node*> _children) {
      val = _val;
      children = _children;
   }
};
string n_ary_to_str(Node *root){
   string ret = "";
   if(root){
      ret = ret + to_string(root->val);
      if(root->children.size() > 0){
         ret += "[";
         for(Node* child : root->children){
            ret += n_ary_to_str(child) + ", ";
         }
         ret += "]";
      }
   }
   return ret;
}
class Codec {
public:
   vector<vector<int>>createVector(string s) {
      vector<vector<int>> ret;
      vector<int> tempv;
      string temp = "";
      for (int i = 0; i < s.size(); i++) {
         if (s[i] != ' ' && s[i] != '#') {
            temp += s[i];
         }
         else if (s[i] == ' ') {
            tempv.push_back(stoi(temp));
            temp = "";
         }
         else if (s[i] == '#') {
            ret.push_back(tempv);
            temp = "";
            tempv.clear();
         }
      }
      while (!ret.empty() && ret.back().size() == 0)
      ret.pop_back();
      return ret;
   }
   string serialize(Node *root) {
      string ret = "";
      if (!root)
         return ret;
      queue<Node *> q;
      q.push(root);
      ret += to_string(root->val);
      ret += " ";
      ret += "#";
      while (!q.empty()) {
         Node *curr = q.front();
         q.pop();
         for (int i = 0; i < curr->children.size(); i++) {
            if (curr->children[i]) {
               ret += to_string(curr->children[i]->val);
               q.push(curr->children[i]);
            }
            ret += " ";
         }
         ret += "#";
      }
      return ret;
   }
   Node *deserialize(string data) {
      Node *ret;
      if (data.size() == 0)
         return NULL;
         vector<vector<int>> v = createVector(data);
         ret = new Node(v[0][0]);
         queue<Node *> q;
         q.push(ret);
         int i = 1;
         while (!q.empty() && i < v.size()) {
            Node *curr = q.front();
            q.pop();
            for (int j = 0; j < v[i].size(); j++) {
               int node = v[i][j];
                  Node *temp = new Node(node);
                  curr->children.push_back(temp);
                  q.push(temp);
               }
               i++;
            }
            return ret;
         }
 };
main() {
   Codec ob;
   Node n5(5), n6(6);
   Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);
   Node n2(2), n4(4);
   Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);
   n1.children.push_back(&n4);
   cout << "Given Tree: " << n_ary_to_str(&n1) << endl;
   string ser = ob.serialize(&n1);
   cout << "Serialize: " << ser << endl;
   Node *deser = ob.deserialize(ser);
   cout << "Deserialized Tree: " << n_ary_to_str(deser);
}

ইনপুট

Node n5(5), n6(6);
Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);
Node n2(2), n4(4);
Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);
n1.children.push_back(&n4);

আউটপুট

Given Tree: 1[3[5, 6, ], 2, 4, ]
Serialize: 1 #3 2 4 #5 6 #####
Deserialized Tree: 1[3[5, 6, ], 2, 4, ]

  1. সি++ এ ইনঅর্ডার এবং পোস্টঅর্ডার ট্রাভার্সাল থেকে প্রি-অর্ডার

  2. C++ এ পুনরাবৃত্তি ছাড়াই N-ary গাছের প্রি-অর্ডার ট্রাভার্সাল

  3. C++ এ DFS ব্যবহার করে একটি n-ary গাছের সমস্ত পাতার নোড প্রিন্ট করুন

  4. পাইথনে বিএসটি সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করুন