Il y a aussi les opérateurs que je contribué à la MoreLinq project on Google Code dans la branche EvenMoreLinq
. Si vous êtes simplement curieux de savoir comment l'algorithme est implémenté, vous pouvez voir le code for Permutations<T>()
here.
Ils sont conçus pour se fondre bien avec LINQ, et utilisent à la fois l'évaluation en différé et en continu. Les permutations sont intéressantes, car la génération de toutes les permutations est une opération N!
... qui devient très grande même pour de petites valeurs de N
. Selon la façon dont vous générez des permutations, vous pouvez (ou ne pouvez pas) les énumérer tous.
Vous trouverez également des algorithmes pour d'autres opérations combinatoires (Subsets, PermutedSubsets, Cartesian Products, Random Subsets, Slices, Partitions, etc.) dans la même base de code.
Voici comment vous pouvez utiliser les extensions MoreLinq pour permuter une séquence. Ainsi, par exemple, vous pouvez permuter une chaîne (qui est traitée comme une séquence de char
s) comme suit:
using MoreLinq;
string input = "cat";
var permutations = input.Permutations();
foreach(var permutation in permutations)
{
// 'permutation' is a char[] here, so convert back to a string
Console.WriteLine(new string(permutation));
}
Avez-vous vérifié la FAQ? http://stackoverflow.com/tags/algorithm/faq –