我有一个很奇怪的问题,其中有一些限制使其难以解决。我有一个列表列表,我想对这些列表中的所有项目进行组合。每个项目都有一个名称和一个值。这是一个例子:
主要清单:
最终结果应如下所示:
一些清单:
新列表几乎包含像哈希映射一样起作用的项目。
约束如下:
换句话说,可以向此组合生成器提供X个列表,每个列表可以包含N个项目,我必须在不使用太多内存的情况下生成它们的组合。
我不希望一次使用5个以上的列表,但我想使该算法尽可能地适应代码更改。
我正在用Java解决问题,但是该算法也应该在其他语言中同样起作用,因为它很可能会被翻译。
您有什么想法和建议吗?
提前致谢。
附言我认为递归不会很好。我正在考虑使用while循环和一些嵌套循环的想法,但是很难想象它应该如何工作。
最佳答案
这就是笛卡尔积,您在追求什么?
假设3个列表包含2、1和3个元素。您将以2 * 1 * 3组合= 6结尾。(摘要:a * b * ... * i)
现在您从0到5取6个数字。
void getCombiFor (int i, List <List <Integer>> li)
{
if (li.length > 0)
{
int idx = i % li.get (0).size ();
System.out.print (li.get (0).get(idx));
getCombiFor (i - idx, li.remove (0));
}
System.out.println ();
}
// pseudocodeline:
List li = List (List ('a', 'b'), List ('c'), List ('d', 'e', 'f'))
for (int i = 0; i < 6; ++i)
{
getCombiFor (i, li);
}
例:
Lists = ((a,b), (c), (d,e,f))
acd
bcd
acf
bcf
ace
bce