【发布时间】:2018-06-19 16:13:36
【问题描述】:
鉴于此列表List(1, 1, 2, 2, 3, 3, 4, 5),我如何生成列表子集的所有组合,并具有以下约束:
- 每个子集只能包含唯一元素。
- 子集的每个组合都必须包含初始列表中的所有元素(包括重复项)。展平组合应该等于我的初始列表。
以下是一些可能的组合:
List(List(1), List(1), List(2), List(2), List(3), List(3),
List(4),List(5)) // 1*8
List(List(1,2), List(1,2), List(3,4), List(3,5)) // 2 *4
List(List(1,2,3), List(1,2,3), List(4,5)) // 3,3 and 2
List(List(1,2,3,4), List(1,2,3,5)) // 4 and 4
List(List(1,2,3,4,5), List(1,2,3)) // 5 and 3
我尝试过这样的事情:
val myList = List(1, 1, 2, 2, 3, 3, 4, 5)
val combs = (1 to 5).map(n => myList.combinations(n).toList.filter(x => x.distinct sameElements x)).toList.flatten
val step2 = (1 to combs.length).flatMap(n => combs.combinations(n)).toList
但是计算太贵了:
java.lang.OutOfMemoryError: Java heap space
【问题讨论】:
-
List(1, 1, 2, 2, 3, 3, 4, 5).toSet.subsets().toList.map(_.toList)
-
第 2 步呢?我需要弄清楚哪些子集组合构成了我的初始列表。