Générer efficacement des permutations d'ensembles
Dans le problème de la génération de permutations d'un ensemble, trouver l'algorithme le plus efficace est crucial. Le code fourni atteint une efficacité élevée, mais pour les calculs exigeants, une optimisation est recherchée.
Solution proposée : l'algorithme de Knuth
L'algorithme de Knuth offre une approche très efficace pour générer des permutations. Il fonctionne en quatre étapes principales :
Implémentation
Le code C# fourni implémentant l'algorithme de Knuth est donné ci-dessous :
private static bool NextPermutation(int[] numList) { // 1. Find the largest index j such that a[j] < a[j + 1]. If no such index exists, the permutation is the last permutation. var largestIndex = -1; for (var i = numList.Length - 2; i >= 0; i--) { if (numList[i] < numList[i + 1]) { largestIndex = i; break; } } // If no such index exists, return false indicating the last permutation. if (largestIndex < 0) return false; // 2. Find the largest index l such that a[j] < a[l]. Since j + 1 is such an index, l is well defined and satisfies j < l. var largestIndex2 = -1; for (var i = numList.Length - 1; i >= 0; i--) { if (numList[largestIndex] < numList[i]) { largestIndex2 = i; break; } } // 3. Swap a[j] with a[l]. var tmp = numList[largestIndex]; numList[largestIndex] = numList[largestIndex2]; numList[largestIndex2] = tmp; // 4. 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; }Considérations sur l'optimisation de la vitesse
Pour une optimisation plus poussée de la vitesse, considérez le suivants :
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!