列表的唯一子集的组合

时间:2018-06-15 17:55:36

标签: algorithm scala

鉴于此列表List(1, 1, 2, 2, 3, 3, 4, 5),如何生成列表子集的所有组合,具有以下约束:

  1. 每个子集只能包含唯一元素。
  2. 每个子集组合必须包含初始列表中的所有元素(包括重复项)。展平组合应该等于我的初始列表。
  3. 以下是一些可能的组合:

    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
    

1 个答案:

答案 0 :(得分:1)

试试这个:

val listLen = l.toSet.size
(1 to listLen).flatMap(x => l.combinations(x).map(x => x.distinct))

如果运行得更快,请回复,否则需要采用其他方法