อัลกอริธึมการสลับบล็อกสำหรับการหมุนอาร์เรย์เป็นอัลกอริธึมที่มีประสิทธิภาพซึ่งใช้สำหรับการหมุนอาร์เรย์ มันสามารถทำงานของคุณในความซับซ้อนของเวลา O(n)
ดังนั้น ในการหมุนอาร์เรย์ เราจะได้รับอาร์เรย์ arr[] ขนาด n และตัวเลข 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 ให้แบ่ง X ออกเป็นสองส่วน X1 และ X2 โดยให้ขนาดของ X1 เท่ากับขนาดของ Y จากนั้นสลับอาร์เรย์ย่อย X1 และ Y ซึ่งจะเปลี่ยนรูปแบบอาร์เรย์ดั้งเดิมจาก X1X2Y เป็น YX2X1.
ขั้นตอนที่ 2.2 − หากขนาดของ Y> X ให้แบ่ง Y ออกเป็นสองส่วน Y1 และ Y2 โดยให้ขนาดของ Y2 เท่ากับขนาดของ X จากนั้นสลับอาร์เรย์ย่อย 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