Trouver efficacement toutes les combinaisons d'éléments de tableau C#
Lorsque vous travaillez avec des éléments de tableau, il est utile d'extraire toutes les combinaisons possibles d'éléments. Cette tâche apparaît souvent dans des domaines tels que l'analyse de données et l'optimisation combinatoire.
Permutations et combinaisons d'éléments répétés
Supposons qu'il existe un tableau [1, 2, 3, 4]. Pour trouver toutes les combinaisons de longueur 2 avec des éléments répétés, vous pouvez utiliser la fonction suivante :
static IEnumerable<IEnumerable<T>> GetPermutationsWithRept<T>(IEnumerable<T> list, int length) { if (length == 1) return list.Select(t => new T[1] { t }); return GetPermutationsWithRept(list, length - 1) .SelectMany(t => list, (t1, t2) => t1.Concat(new T[1] { t2 })); }
Cette fonction considère les combinaisons contenant des éléments répétés, tels que [1, 1], [1, 2], etc.
Permutation et combinaison (hors éléments répétés)
Pour exclure les éléments en double, utilisez la fonction GetPermutations
:
static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length) { if (length == 1) return list.Select(t => new T[1] { t }); return GetPermutations(list, length - 1) .SelectMany(t => list.Where(o => !t.Contains(o)), (t1, t2) => t1.Concat(new T[1] { t2 })); }
Cette fonction garantit des combinaisons telles que [1, 2], [1, 3] et [2, 3], mais pas [1, 1].
Combinaison K avec éléments répétés
Pensez à trouver des combinaisons de longueur 2 avec des éléments répétés, permettant plusieurs occurrences de l'élément :
static IEnumerable<IEnumerable<T>> GetKCombsWithRept<T>(IEnumerable<T> list, int length) where T : IComparable { if (length == 1) return list.Select(t => new T[1] { t }); return GetKCombsWithRept(list, length - 1) .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) >= 0), (t1, t2) => t1.Concat(new T[1] { t2 })); }
Cette fonction génère des combinaisons telles que [1, 1], [1, 2] et [2, 2].
Combinaison K (hors éléments répétés)
Pour les combinaisons sans éléments répétés :
static IEnumerable<IEnumerable<T>> GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable { if (length == 1) return list.Select(t => new T[1] { t }); return GetKCombs(list, length - 1) .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0), (t1, t2) => t1.Concat(new T[1] { t2 })); }
Cette fonction génère des combinaisons telles que [1, 2], [1, 3] et [2, 3].
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!