logo

האלגוריתם של HEAP לייצור פרמוטציות

האלגוריתם של HEAP משמש ליצירת כל הפרמוטציות של N אובייקטים. הרעיון הוא לייצר כל פרמוטציה מהפרמוטציה הקודמת על ידי בחירת זוג אלמנטים להחלפה מבלי להפריע לאחר n-2 אלמנטים. 
להלן ההמחשה לייצור כל הפרמוטציות של מספרים ניתנים.
דוּגמָה:  

  Input:   1 2 3   Output:   1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1

אַלגוֹרִיתְם: 



  1. האלגוריתם מייצר (N-1)! פרמוטציות של אלמנטים N-1 הראשונים הסמוכים לאלמנט האחרון לכל אחד מאלה. זה יפיק את כל הפרמוטציות המסתיימות עם האלמנט האחרון.
  2. אם n הוא מוזר החלף את האלמנט הראשון והאחרון ואם n הוא אפילו אז החלף את ה- iהאלמנט (אני הדלפק מתחיל מ- 0) והאלמנט האחרון וחוזר על האלגוריתם לעיל עד שאני פחות מ- n.
  3. בכל איטרציה האלגוריתם יפיק את כל הפרמוטציות המסתיימות עם האלמנט האחרון הנוכחי.

יישום:   

C++
// C++ program to print all permutations using // Heap's algorithm #include    using namespace std; // Prints the array void printArr(int a[] int n) {  for (int i = 0; i < n; i++)  cout << a[i] << ' ';  printf('n'); } // Generating permutation using Heap Algorithm void heapPermutation(int a[] int size int n) {  // if size becomes 1 then prints the obtained  // permutation  if (size == 1) {  printArr(a n);  return;  }  for (int i = 0; i < size; i++) {  heapPermutation(a size - 1 n);  // if size is odd swap 0th i.e (first) and   // (size-1)th i.e (last) element  if (size % 2 == 1)  swap(a[0] a[size - 1]);  // If size is even swap ith and   // (size-1)th i.e (last) element  else  swap(a[i] a[size - 1]);  } } // Driver code int main() {  int a[] = { 1 2 3 };  int n = sizeof a / sizeof a[0];  heapPermutation(a n n);  return 0; } 
Java
// Java program to print all permutations using // Heap's algorithm import java.io.*; class HeapAlgo {  // Prints the array  void printArr(int a[] int n)  {  for (int i = 0; i < n; i++)  System.out.print(a[i] + ' ');  System.out.println();  }  // Generating permutation using Heap Algorithm  void heapPermutation(int a[] int size int n)  {  // if size becomes 1 then prints the obtained  // permutation  if (size == 1)  printArr(a n);  for (int i = 0; i < size; i++) {  heapPermutation(a size - 1 n);  // if size is odd swap 0th i.e (first) and  // (size-1)th i.e (last) element  if (size % 2 == 1) {  int temp = a[0];  a[0] = a[size - 1];  a[size - 1] = temp;  }  // If size is even swap ith   // and (size-1)th i.e last element  else {  int temp = a[i];  a[i] = a[size - 1];  a[size - 1] = temp;  }  }  }  // Driver code  public static void main(String args[])  {  HeapAlgo obj = new HeapAlgo();  int a[] = { 1 2 3 };  obj.heapPermutation(a a.length a.length);  } } // This code has been contributed by Amit Khandelwal. 
Python3
# Python program to print all permutations using # Heap's algorithm # Generating permutation using Heap Algorithm def heapPermutation(a size): # if size becomes 1 then prints the obtained # permutation if size == 1: print(a) return for i in range(size): heapPermutation(a size-1) # if size is odd swap 0th i.e (first) # and (size-1)th i.e (last) element # else If size is even swap ith # and (size-1)th i.e (last) element if size & 1: a[0] a[size-1] = a[size-1] a[0] else: a[i] a[size-1] = a[size-1] a[i] # Driver code a = [1 2 3] n = len(a) heapPermutation(a n) # This code is contributed by ankush_953 # This code was cleaned up to by more pythonic by glubs9 
C#
// C# program to print all permutations using // Heap's algorithm using System; public class GFG {  // Prints the array  static void printArr(int[] a int n)  {  for (int i = 0; i < n; i++)  Console.Write(a[i] + ' ');  Console.WriteLine();  }  // Generating permutation using Heap Algorithm  static void heapPermutation(int[] a int size int n)  {  // if size becomes 1 then prints the obtained  // permutation  if (size == 1)  printArr(a n);  for (int i = 0; i < size; i++) {  heapPermutation(a size - 1 n);  // if size is odd swap 0th i.e (first) and  // (size-1)th i.e (last) element  if (size % 2 == 1) {  int temp = a[0];  a[0] = a[size - 1];  a[size - 1] = temp;  }  // If size is even swap ith and  // (size-1)th i.e (last) element  else {  int temp = a[i];  a[i] = a[size - 1];  a[size - 1] = temp;  }  }  }  // Driver code  public static void Main()  {  int[] a = { 1 2 3 };  heapPermutation(a a.Length a.Length);  } } /* This Java code is contributed by 29AjayKumar*/ 
JavaScript
<script> // JavaScript program to print all permutations using // Heap's algorithm // Prints the array function printArr(an) {  document.write(a.join(' ')+'  
'
); } // Generating permutation using Heap Algorithm function heapPermutation(asizen) { // if size becomes 1 then prints the obtained // permutation if (size == 1) printArr(a n); for (let i = 0; i < size; i++) { heapPermutation(a size - 1 n); // if size is odd swap 0th i.e (first) and // (size-1)th i.e (last) element if (size % 2 == 1) { let temp = a[0]; a[0] = a[size - 1]; a[size - 1] = temp; } // If size is even swap ith // and (size-1)th i.e last element else { let temp = a[i]; a[i] = a[size - 1]; a[size - 1] = temp; } } } // Driver code let a=[1 2 3]; heapPermutation(a a.length a.length); // This code is contributed by rag2127 </script>

תְפוּקָה
1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1 

מורכבות זמן: O (n*n!) כאשר n הוא גודל המערך הנתון.
שטח עזר: O (n) עבור שטח ערימה רקורסיבי בגודל N.

הפניות:  
1. 'https://en.wikipedia.org/wiki/heap%27s_algorithm#cite_note-3