D'accord, alors, j'ai une liste de listes, comme le titre le dit, et je veux faire des combinaisons de k listes dans lesquelles chaque liste a des éléments différents des autres.
Exemple:
J'ai la liste de listes suivante:
{ {1,2,3} , {1,11} , {2,3,6} , {6,5,7} , {4,8,9} }
Une combinaison valide de ces listes de taille 3 pourrait être:
{ {1,11}, {4,8,9} ,{6,5,7} }
Ceci n'est qu'UNE des combinaisons valides, ce que je veux retourner est une liste de toutes les combinaisons valides de K listes.
Une combinaison invalide serait:
{ {1,11} ,{2, 3, 6}, {6, 5, 7} }
parce que l'élément 6 est présent dans la deuxième et troisième liste.
J'ai déjà un code qui fait cela mais il trouve simplement toutes les combinaisons possibles et vérifie si elles sont valides avant de les ajouter à une liste de résultats finale. Comme cette liste de listes est assez grande (153 listes), lorsque K devient plus grand, le temps pris est aussi ridiculement grand (à K = 5 cela me prend environ 10 minutes.)
Je veux voir s'il y a un moyen efficace de le faire. Ci-dessous se trouve mon code actuel (les listes que je veux combiner sont des attributs de la classe Item):
public void recursiveComb(List arr, int len, int startPosition, Item[] result)
{
if (len == 0)
{
if (valid(result.ToList()))
{
//Ici j'ajoute le résultat à la liste finale
//valid est juste une fonction qui vérifie si une liste a des éléments en double dans une autre
}
return;
}
for (int i = startPosition; i <= arr.Count - len; i++)
{
result[result.Length - len] = arr[i];
recursiveComb(arr, len - 1, i + 1, result);
}
}