java – 如何在飞行中进行组合

我有一个非常奇怪的问题,有一些限制,使其难以解决.我有一个列表列表,我想要对这些列表中的所有项目进行组合.每个项目都有一个名称和一个值.这是一个例子:

主要清单:

>清单01:

>项目01:名称:name01,值:value01
>项目02:名称:name02,值:value02

>清单02:

>项目01:名称:name03,值:value03

>清单03:

>项目01:名称:name04,值:value04
>项目02:名称:name05,值:value05

最终结果应如下所示:

一些清单:

>项目01:name01:value01,name03:value03,name04:value04
>项目02:name02:value02,name03:value03,name04:value04
>项03:name03:value03,name03:value03,name04:value04
>项目04:name01:value01,name03:value03,name04:value05
>项目05:name02:value02,name03:value03,name04:value05
>项目06:name03:value03,name03:value03,name04:value05

新列表几乎包含像哈希映射一样的项目.

约束如下:

>我无法收集到新的列表并混合它们,因为这些列表可能会迅速增长.
>我正在使用某种类似观察者的API,所以我需要尽快让观察者了解结果,这样我才不会使用太多记忆.

换句话说,该组合生成器可以用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
上一篇:c# – 使用LINQ获取不同的数字组合


下一篇:php – 通过向多个买家销售商品来查找最高总价,受限于用户输入可以进行多少单独销售