Хорошо, у меня есть список списков, как и в заголовке, и я хочу создать комбинации из k списков, в которых каждый список имеет элементы, отличные от остальных.
Пример :
У меня есть следующий список списков:
{ {1,2,3} , {1,11} , {2,3,6} , {6,5,7} , {4,8,9} }
Допустимая 3-размерная комбинация этих списков может быть:
{ {1,11}, {4,8,9} ,{6,5,7} }
Это только ОДИН издействительные комбинации, которые я хочу вернуть, это список всех допустимых комбинаций списков K.
Недопустимая комбинация будет:
{ {1,11} ,{2, 3, 6}, {6, 5, 7} }
, поскольку элемент 6 присутствует ввторой и третий список.
У меня уже есть код, который делает это, но он просто находит все возможные комбинации и проверяет, являются ли они действительными, прежде чем добавить его в список окончательных результатов.Поскольку этот список списков довольно велик (153 списка), когда K становится больше, время, потраченное на него, тоже смехотворно велико (при K = 5 это занимает у меня около 10 минут.)
Я хочу посмотреть, есть лиэффективный способ сделать это.Ниже приведен мой текущий код (списки, которые я хочу объединить, являются атрибутом класса Item):
public void recursiveComb(List<Item> arr, int len, int startPosition, Item[] result)
{
if (len == 0)
{
if (valid(result.ToList()))
{
//Here I add the result to final list
//valid is just a function that checks if any list has repeated elements in other
}
return;
}
for (int i = startPosition; i <= arr.Count - len; i++)
{
result[result.Length - len] = arr[i];
recursiveComb(arr, len - 1, i + 1, result);
}
}