কম্পিউটার

C++ এ O(1) অতিরিক্ত স্থানের সাথে বিকল্প ইতিবাচক এবং নেতিবাচক আইটেমগুলিতে বিন্যাস পুনরায় সাজান


আমাদেরকে একটি পূর্ণসংখ্যা টাইপ অ্যারে দেওয়া হয়েছে যাতে ধনাত্মক এবং ঋণাত্মক উভয় সংখ্যা থাকে, ধরা যাক, যে কোনো প্রদত্ত আকারের arr[]। কাজটি হল একটি বিন্যাসকে এমনভাবে সাজানো যাতে একটি ধনাত্মক সংখ্যা থাকবে যা ঋণাত্মক সংখ্যা দ্বারা বেষ্টিত হবে। যদি আরও ধনাত্মক এবং ঋণাত্মক সংখ্যা থাকে, তাহলে সেগুলি একটি অ্যারের শেষে সাজানো হবে৷

আসুন এর জন্য বিভিন্ন ইনপুট আউটপুট পরিস্থিতি দেখি -

ইনপুট − int arr[] ={-1, -2, -3, 1, 2, 3}

আউটপুট − বিন্যাসের পূর্বে বিন্যাস:-1 -2 -3 1 2 3 O(1) অতিরিক্ত স্থান সহ পজিটিভ এবং নেতিবাচক আইটেমগুলির বিকল্পে একটি বিন্যাসের পুনর্বিন্যাস হল:-1 1 -2 2 -3 3

ব্যাখ্যা − আমাদের ধনাত্মক এবং নেতিবাচক উভয় উপাদান সমন্বিত আকার 6 এর একটি পূর্ণসংখ্যা অ্যারে দেওয়া হয়েছে। এখন, আমরা অ্যারেটিকে এমনভাবে পুনর্বিন্যাস করব যাতে সমস্ত ধনাত্মক উপাদানগুলি নেতিবাচক উপাদানগুলি দ্বারা বেষ্টিত হবে এবং সমস্ত অতিরিক্ত উপাদানগুলি একটি অ্যারের শেষে যোগ করা হবে অর্থাৎ -1 1 -2 2 -3 3 চূড়ান্ত হবে। ফলাফল।

ইনপুট − int arr[] ={-1, -2, -3, 1, 2, 3, 5, 5, -5, 3, 1, 1};

আউটপুট − বিন্যাসের পূর্বে বিন্যাস:-1 -2 -3 1 2 3 5 5 -5 3 1 1 O(1) অতিরিক্ত স্থান সহ পজিটিভ এবং নেতিবাচক আইটেমগুলির বিকল্পে একটি অ্যারের পুনর্বিন্যাস হল:-1 1 -2 2 -3 3 -5 5 5 3 1 1

ব্যাখ্যা − আমাদেরকে 12 আকারের একটি পূর্ণসংখ্যা অ্যারে দেওয়া হয়েছে যাতে ইতিবাচক এবং নেতিবাচক উভয় উপাদান রয়েছে। এখন, আমরা অ্যারেটিকে এমনভাবে পুনর্বিন্যাস করব যাতে সমস্ত ধনাত্মক উপাদানগুলি নেতিবাচক উপাদান দ্বারা বেষ্টিত হবে এবং সমস্ত অতিরিক্ত উপাদানগুলি একটি অ্যারের শেষে যোগ করা হবে যেমন -1 1 -2 2 -3 3 -5 5 5 3 1 1 চূড়ান্ত ফলাফল হবে৷

নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • পূর্ণসংখ্যা ধরনের উপাদানগুলির একটি অ্যারে ইনপুট করুন এবং একটি অ্যারের আকার গণনা করুন৷

  • FOR লুপ ব্যবহার করে পুনর্বিন্যাস ক্রিয়া সম্পাদন করার আগে একটি অ্যারে প্রিন্ট করুন৷

  • প্যারামিটার হিসাবে অ্যারের অ্যারে এবং সাইজ পাস করে ফাংশন পুনর্বিন্যাস (আর, আকার) এ কল করুন।

  • ফাংশনের ভিতরে পুনর্বিন্যাস (আর, আকার)

    • একটি পূর্ণসংখ্যা পরিবর্তনশীল 'ptr' ঘোষণা করুন এবং এটিকে -1 দিয়ে শুরু করুন।

    • i থেকে 0 পর্যন্ত FOR লুপ শুরু করুন যতক্ষণ না আমি আকারের চেয়ে কম। লুপের ভিতরে, 0 এর থেকে বড় IF ptr চেক করুন তারপর IF arr[i] 0 এর থেকে বড় এবং arr[ptr] 0 এর কম বা arr[i] 0 এর কম এবং arr[ptr] 0 এর চেয়ে বড় তারপর মুভ_অ্যারে ফাংশনে কল করুন (arr, size, ptr, i) এবং চেক করুন IF i - ptr 2-এর বেশি তারপর ptr-এ ptr + 2 সেট করুন। অন্যথা, ptr-এ সেট করুন -1।

    • IF ptr to -1 চেক করুন তারপর arr[i] 0 AND !(i &0x01) বা (arr[i] 0 এর চেয়ে কম) এবং (i &0x01) তারপর ptr এ সেট করুন।

  • ফাংশনের ভিতরে move_array(int arr[], int size, int ptr, int temp)

    • একটি ভেরিয়েবলকে টাইপ অক্ষরের 'ch' হিসাবে ঘোষণা করুন এবং এটিকে arr[temp] দিয়ে সেট করুন।

    • i থেকে temp পর্যন্ত i ptr থেকে বড় না হওয়া পর্যন্ত FOR লুপ শুরু করুন। লুপের ভিতরে, arr[i - 1] এর সাথে arr[i] সেট করুন।

    • arr[ptr] কে ch এ সেট করুন।

উদাহরণ

#include <iostream>
#include <assert.h>
using namespace std;
void move_array(int arr[], int size, int ptr, int temp){
   char ch = arr[temp];
   for(int i = temp; i > ptr; i--){
      arr[i] = arr[i - 1];
   }
   arr[ptr] = ch;
}
void Rearrangement(int arr[], int size){
   int ptr = -1;
   for(int i = 0; i < size; i++){
      if (ptr >= 0){
         if(((arr[i] >= 0) && (arr[ptr] < 0)) || ((arr[i] < 0) && (arr[ptr] >= 0))){
            move_array(arr, size, ptr, i);
            if(i - ptr >= 2){
               ptr = ptr + 2;
            }
            else{
               ptr = -1;
            }
         }
      }
      if(ptr == -1){
         if (((arr[i] >= 0) && (!(i & 0x01))) || ((arr[i] < 0) && (i & 0x01))){
            ptr = i;
         }
      }
   }
}
int main(){
   //input an array
   int arr[] = {-1, -2, -3, 1, 2, 3};
   int size = sizeof(arr) / sizeof(arr[0]);
   //print the original Array
   cout<<"Array before Arrangement: ";
   for (int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   //calling the function to rearrange the array
   Rearrangement(arr, size);
   //print the array after rearranging the values
   cout<<"\nRearrangement of an array in alternating positive & negative items with O(1) extra space is: ";
   for(int i = 0; i < size; i++){
      cout<< arr[i] << " ";
   }
   return 0;
}

আউটপুট

যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট তৈরি করবে

Array before Arrangement: -1 -2 -3 1 2 3
Rearrangement of an array in alternating positive & negative items with O(1) extra space is: -1 1 -2 2 -3 3

  1. C++ এ O(1) স্পেসে 0 থেকে N-1 উপাদান সহ ধ্রুবক অ্যারেতে সদৃশগুলি খুঁজুন

  2. উদাহরণ সহ C++ STL-এ অ্যারে ডেটা()

  3. C++ এ প্রাইম ফ্রিকোয়েন্সি সহ অ্যারে উপাদান?

  4. একটি পণ্য অ্যারে ধাঁধা (O(1) স্থান) C++?