Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 배열 회전을 위한 블록 스왑 알고리즘

<시간/>

배열 회전을 위한 블록 스왑 알고리즘은 배열 회전에 사용되는 효율적인 알고리즘입니다. O(n) 시간 복잡도에서 작업을 수행할 수 있습니다.

따라서 배열 회전에서 크기가 n인 배열 arr[]와 아니오를 정의하는 숫자 k가 제공됩니다. 회전할 요소의

배열 회전에 대한 예를 살펴보겠습니다. -

입력 -

arr[] = {4, 6, 1, 8, 9, 2}, k = 2 (number of rotations.)

출력 -

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

설명 − 회전 시 한 요소를 마지막 위치로 이동하고 다음 요소를 한 위치로 이동합니다.

인덱스 0의 요소는 인덱스 n-1로 이동합니다. 그리고 나머지 요소는 이전 인덱스로 이동합니다.

블록 스왑 알고리즘

블록 스왑 알고리즘은 배열 회전을 완벽하게 수행하는 데 사용됩니다.

알고리즘

1단계 − k를 분할점으로 하여 어레이를 두 개의 하위 어레이로 나눕니다. X =arr[0...k-1] 및 Y =arr[k...n-1]이라고 합시다.

2단계 − X와 Y의 크기가 같아질 때까지 다음 단계를 따릅니다.

2.1단계 - X의 크기가 Y> Y이면 X1의 크기가 Y의 크기와 같도록 X를 두 부분 X1과 X2로 나눕니다. 그런 다음 하위 배열 X1과 Y를 교체합니다. 그러면 원래 배열 구성이 X1X2Y에서 다음으로 변경됩니다. YX2X1.

2.2단계 − Y의 크기가 X> X이면 Y2의 크기가 X의 크기와 같도록 Y를 두 부분 Y1과 Y2로 나눕니다. 그런 다음 하위 배열 X와 Y2를 바꿉니다. 이렇게 하면 원래 배열 구성이 XY1Y2에서 Y2Y1X로 변경됩니다.

3단계 − 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