【发布时间】:2011-10-20 08:28:25
【问题描述】:
我希望有人能够帮助我解决至少对我来说相当棘手的算法。
问题
我有一个需要合并的列表 (1 <= size <= 2) 列表(1 <= size <= 5,但在运行时之前大小未知)。这是我正在查看的示例:-
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,2,2,3,3
- 2,2,3,3,3
- 2,3,3,3,3
- 3,3,3,3,3
致所有有数学头脑的人 - 我希望你能提供帮助。实际上,我已经为第 2 部分找到了一个可行的解决方案,但它完全是 hack 并且计算量很大,我正在寻找指导以找到更优雅、更有效的 LINQ 解决方案来解决修剪问题。
感谢阅读。
点
目前使用的一些资源(用于获取笛卡尔积)
更新 - 解决方案
很抱歉没有早点发布...见below
【问题讨论】:
标签: linq aggregate combinations cartesian-product multiset