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

C++-এ অ্যারে রোটেশনের জন্য ব্লক সওয়াপ অ্যালগরিদম


অ্যারে রোটেশনের জন্য ব্লক সওয়াপ অ্যালগরিদম একটি দক্ষ অ্যালগরিদম যা অ্যারে রোটেশন করতে ব্যবহৃত হয়। এটি O(n) টাইম কমপ্লেক্সিটিতে কাজ করতে পারে।

অ্যারে রোটেশনে, আমাদের একটি অ্যারে arr[] দেওয়া থাকে যার আকার n এবং একটি সংখ্যা k যা রোটেট করার এলিমেন্টের সংখ্যা নির্দেশ করে।

অ্যারে রোটেশনের উদাহরণ −

ইনপুট −

arr[] = {4, 6, 1, 8, 9, 2}, k = 2 (রোটেশনের সংখ্যা.)

আউটপুট −

{1, 8, 9, 2, 4, 6}

ব্যাখ্যা − রোটেশনে, আমরা একটি এলিমেন্টকে শেষ পজিশনে শিফ্ট করি এবং বাকি এলিমেন্টগুলো এক পজিশন শিফ্ট করি।

ইনডেক্স ০-এর এলিমেন্ট ইনডেক্স n-1-এ শিফ্ট হবে। এবং বাকি এলিমেন্টগুলো আগের ইনডেক্সে শিফ্ট হবে।

ব্লক সওয়াপ অ্যালগরিদম

ব্লক সওয়াপ অ্যালগরিদম অ্যারে রোটেশন পূর্ণ করতে ব্যবহৃত হয়।

অ্যালগরিদম

স্টেপ ১ − অ্যারেকে দুটি সাব-অ্যারেতে ভাগ করুন k-কে বিভাজন বিন্দু ধরে। এগুলো হবে X = arr[0...k-1] এবং Y = arr[k...n-1]।

স্টেপ ২ − নিচের স্টেপগুলো অনুসরণ করুন যতক্ষণ না X এবং Y-এর আকার সমান হয়।

স্টেপ ২.১ − যদি X-এর আকার Y-এর চেয়ে বড় হয়, X কে দুটি অংশ X1 এবং X2-এ ভাগ করুন যেন X1-এর আকার Y-এর আকারের সমান হয়। তারপর সাব-অ্যারে X1 এবং Y সওয়াপ করুন। এটি মূল অ্যারে ফরমেশনকে X1X2Y থেকে YX2X1-এ পরিবর্তন করবে।

স্টেপ ২.২ − যদি Y-এর আকার X-এর চেয়ে বড় হয়, Y কে দুটি অংশ Y1 এবং Y2-এ ভাগ করুন যেন Y2-এর আকার X-এর আকারের সমান হয়। তারপর সাবঅ্যারে X এবং Y2 সওয়াপ করুন। এটি মূল অ্যারে ফরমেশনকে XY1Y2 থেকে Y2Y1X-এ পরিবর্তন করবে।

স্টেপ ৩ − যখন X এবং Y-এর আকার সমান হয়, সেগুলো সওয়াপ করুন।

এই অ্যালগরিদমে একই কোড চানককে বারবার কল করতে হয়। এই রিপিটিটিভ কল দুটি পদ্ধতিতে করা যায়: রিকার্সিভ পদ্ধতি এবং ইটেরেটিভ পদ্ধতি। আমরা প্রোগ্রাম দিয়ে পদ্ধতিগুলো আলোচনা করব।

উদাহরণ

রিকার্সিভ পদ্ধতির প্রোগ্রাম −

#include <iostream> 
using namespace std; 

void swapSubArray(int arr[], int start, int end, intk){ 
    int temp; 
    for(int i = 0; i < k; i++){ 
        temp = arr[start + i]; 
        arr[start + i] = arr[end + i]; 
        arr[end + i] = temp; 
    } 
} 

void blockSwapAlgo(int arr[], int k, int n) { 
    if(k == 0 || k == n) 
        return; 
    if(k<(n-k)) { 
        swapSubArray(arr, 0, (n-k), k); 
        blockSwapAlgo(arr, k, (n-k)); 
    } 
    else if(k>(n-k)){ 
        swapSubArray(arr, 0, k, (n-k)); 
        blockSwapAlgo((arr+n-k), (2*k-n), k); 
    } 
    else{ 
        swapSubArray(arr, 0, (n-k), k); 
        return; 
    } 
} 

int main() { 
    int arr[] = {4, 6, 1, 8, 9, 2}; 
    int size = sizeof(arr) / sizeof(arr[0]); 
    int k = 3; 
    cout<<"Array before rotations :\t"; 
    for(int i = 0; i<size; i++) 
        cout<<arr[i]<<" "; 
    blockSwapAlgo(arr, k, size); 
    cout<<"\nArray after rotating "<<k<<" times :\t"; 
    for(int i = 0; i<size; i++) 
        cout<<arr[i]<<" "; 
    return 0; 
}

আউটপুট

Array before rotations : 4 6 1 8 9 2 
Array after rotating 3 times : 8 9 2 4 6 1

উদাহরণ

ইটেরেটিভ পদ্ধতির প্রোগ্রাম −

#include <iostream> 
using namespace std; 

void swapSubArray(int arr[], int start, int end, int k){ 
    int temp; 
    for(int i = 0; i < k; i++){ 
        temp = arr[start + i]; 
        arr[start + i] = arr[end + i]; 
        arr[end + i] = temp; 
    } 
} 

void blockSwapAlgoIt(int arr[], int k, int size) { 
    int i, j; 
    if(k == 0 || k == size) 
        return; 
    i = k; 
    j = size - k; 
    while (i != j) { 
        if(i < j){ 
            swapSubArray(arr, k-i, k+j-i, i); 
            j -= i; 
        } 
        else{ 
            swapSubArray(arr, k-i, k, j); 
            i -= j; 
        } 
    } 
    swapSubArray(arr, k-i, k, i); 
} 

int main() { 
    int arr[] = {4, 6, 1, 8, 9, 2}; 
    int size = sizeof(arr) / sizeof(arr[0]); 
    int k = 3; 
    cout<<"Array before rotations :\t"; 
    for(int i = 0; i<size; i++) 
        cout<<arr[i]<<" "; 
    blockSwapAlgoIt(arr, k, size); 
    cout<<"\nArray after rotating "<<k<<" times :\t"; 
    for(int i = 0; i<size; i++) 
        cout<<arr[i]<<" "; 
    return 0; 
}

আউটপুট

Array before rotations : 4 6 1 8 9 2 
Array after rotating 3 times : 8 9 2 4 6 1

  1. C++ প্রোগ্রাম: অ্যারে উপাদানগুলোর গুণফল বের করা

  2. হিপ সর্ট অ্যালগরিদম ব্যবহার করে ১০ উপাদানের অ্যারে সর্ট করার C++ প্রোগ্রাম

  3. অ্যারে রোটেশনের জন্য রিভার্সাল অ্যালগরিদমের জাভা প্রোগ্রাম

  4. অ্যারে রোটেশনের জন্য জাভা প্রোগ্রাম