我想根据数字的起始列表有效地生成数字组合的唯一列表。
示例开始list = [1,2,3,4,5]
,但是该算法应适用于[1,2,3...n]
result =
[1],[2],[3],[4],[5]
[1,2],[1,3],[1,4],[1,5]
[1,2,3],[1,2,4],[1,2,5]
[1,3,4],[1,3,5],[1,4,5]
[2,3],[2,4],[2,5]
[2,3,4],[2,3,5]
[3,4],[3,5]
[3,4,5]
[4,5]
注意。我不需要重复的组合,尽管我可以使用它们,例如,在上面的示例中,我实际上并不需要组合[1,3,2],因为它已经显示为[1,2,3]
最佳答案
您要问的名字有一个。它称为power set。
搜寻“功率集算法”使我想到了这个recursive solution。
Ruby算法
def powerset!(set)
return [set] if set.empty?
p = set.pop
subset = powerset!(set)
subset | subset.map { |x| x | [p] }
end
功率设定直觉
如果S =(a,b,c),则幂集(S)是所有子集的集合
powerset(S)= {(),(a),(b),(c),(a,b),(a,c),(b,c),(a,b,c)}
第一个“技巧”是尝试递归地定义。
什么是停止状态?
S =()具有什么幂集(S)?
如何获得?
减少一组元素
考虑取出一个元素-在上面的示例中,取出{c}
S =(a,b),然后幂集(S)= {(),(a),(b),(a,b)}
什么东西少了?
powerset(S)= {(c),(a,c),(b,c),(a,b,c)}
嗯
有任何相似之处吗?再看...
powerset(S)= {(),(a),(b),(c),(a,b),(a,c),(b,c),(a,b,c)}
取出任何元素
powerset(S)= {(),(a),(b),(c),(a,b),(a,c),(b,c),(a,b,c)} 是
powerset(S-{c})= {(),(a),(b),(a,b)}与
{c} U powerset(S-{c})= {(c),(a,c),(b,c),(a,b,c)}
powerset(S)= powerset(S-{ei})U({ei} U powerset(S-{ei}))
其中ei是S的元素(单例)
伪算法
关于algorithm - 哪种算法可以计算给定集合的幂集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2779094/