Génération rapide de permutations à l'aide de l'algorithme de Knuth
L'optimisation de la génération de permutations est un problème fondamental en informatique. Ceci est particulièrement crucial lorsqu’il s’agit de grands ensembles de données, où le temps requis pour énumérer toutes les permutations peut devenir important. L'extrait de code suivant présente un algorithme efficace pour générer des permutations, connu sous le nom d'algorithme de Knuth :
private static bool NextPermutation(int[] numList) { // Find the largest index j such that a[j] < a[j + 1]. int largestIndex = -1; for (int i = numList.Length - 2; i >= 0; i--) { if (numList[i] < numList[i + 1]) { largestIndex = i; break; } } // If no such index exists, the permutation is the last permutation. if (largestIndex < 0) return false; // Find the largest index l such that a[j] < a[l]. int largestIndex2 = -1; for (int i = numList.Length - 1 ; i >= 0; i--) { if (numList[largestIndex] < numList[i]) { largestIndex2 = i; break; } } // Swap a[j] with a[l]. int tmp = numList[largestIndex]; numList[largestIndex] = numList[largestIndex2]; numList[largestIndex2] = tmp; // Reverse the sequence from a[j + 1] up to and including the final element a[n]. for (int i = largestIndex + 1, j = numList.Length - 1; i < j; i++, j--) { tmp = numList[i]; numList[i] = numList[j]; numList[j] = tmp; } return true; }
Cet algorithme fonctionne en temps O(n^2), où n représente le nombre d'éléments dans la liste d'entrée. Il utilise plusieurs optimisations pour minimiser les calculs, notamment :
Ces optimisations garantissent une génération efficace de la permutation suivante dans un ensemble, ce qui rend cet algorithme parfaitement adapté aux applications nécessitant une génération de permutation rapide.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!