Я надеюсь, что кто-то сможет помочь мне с тем, что, по крайней мере для меня, довольно сложный алгоритм.
Проблема
У меня есть список (1 <= size <= 5
, но размернеизвестно до времени выполнения) списков (1 <= size <= 2
), которые мне нужно объединить.Вот пример того, на что я смотрю: -
ListOfLists = { {1}, {2,3}, {2,3}, {4}, {2,3} }
Итак, мне нужно сделать 2 этапа: -
(1).Мне нужно объединить внутренние списки таким образом, чтобы любая комбинация имела ровно ОДИН элемент из каждого списка, то есть возможные комбинации в наборе результатов здесь были бы: -
- 1,2,2,4,2
- 1,2,2,4,3
- 1,2,3,4,2
- 1,2,3,4,3
- 1,3,2,4,2
- 1,3,2,4,3
- 1,3,3,4,2
- 1,3,3,4,3
Декартово произведение позаботится об этом, поэтому этап 1 завершен ..... теперь, вот поворот, который я не могу понять- по крайней мере, я не могу понять способ LINQ сделать это (я все еще новичок LINQ).
(2).Теперь мне нужно отфильтровать дубликаты результатов этого декартова произведения.Дубликат в этом случае представляет собой любую строку в наборе результатов с тем же количеством каждого отдельного элемента списка, что и другая строка, то есть
1,2,2,4,3 - это то же самое, что и 1, 3,2,4,2
, поскольку каждый отдельный элемент в первом списке встречается одинаковое количество раз в обоих списках (1 встречается один раз в каждом списке, 2 встречается дважды в каждом списке, ....
Поэтому итоговый набор результатов должен выглядеть следующим образом ...
- 1,2,2,4,2
- 1,2,2,4,3
- -
- 1,2,3,4,3
- -
- -
- -
- 1,3,3,4,3
Другим примером является сценарий наихудшего случая (с комбинированной точки зрения), где ListOfLists равен {{2,3}, {2,3}, {2,3}, {2,3}, {2,3}}, то есть список, содержащий внутренние списки максимального размера - в этом случае, очевидно, будет 32 результата в результате декартового произведения.установлен, но сокращенный набор результатов, который я пытаюсь получить, будет просто: -
- 2,2,2,2,2
- 2,2,2,2,3 <- все остальные результаты с четырьмя 2 и одним 3 (в любом порядке) подавляются </li>
- 2,2,2,3,3 <- все остальные результаты стри 2 и 2 3 подавляются и т. д. </li>
- 2,2,3,3,3
- 2,3,3,3,3
- 3,3,3, 3,3
Любым математически настроенным людям - надеюсь, вы поможете.На самом деле у меня есть рабочее решение для части 2, но это полный взлом и требует больших вычислительных ресурсов, и я ищу руководство по поиску более элегантного и эффективного решения LINQ для решения проблемы сокращения.
Спасибо за чтение.
pip
Некоторые ресурсы, использованные до сих пор (чтобы получить декартово произведение)
ОБНОВЛЕНИЕ - Решение
Извинения за то, что не опубликовали это раньше ... см. ниже