我希望有人能够帮助我,至少对我来说,这是一个相当棘手的算法。
问题
我有一个 List ( 1 <= size <= 5
,但直到运行时大小未知) List ( 1 <= size <= 2
) 需要组合。这是我正在查看的示例:-
ListOfLists = { {1}, {2,3}, {2,3}, {4}, {2,3} }
所以,我需要做的有两个阶段:-
(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(以任何顺序)的结果都被抑制
- 2,2,2,3,3 <-- 三个 2 和两个 3 的所有其他结果都被抑制,等等
- 2,2,3,3,3
- 2,3,3,3,3
- 3,3,3,3,3
对于任何有数学头脑的人-我希望你能提供帮助。实际上,我已经为第 2 部分找到了一个可行的解决方案,但它完全是 hack,并且计算量很大,我正在寻找指导以找到更优雅、更有效的 LINQ 解决方案来解决修剪问题。
谢谢阅读。
点子
到目前为止使用的一些资源(获取笛卡尔积)
更新 - 解决方案
抱歉没有早点发布……见下文