给定一个包含M个子集合的集合,什么是一个好的算法(最好是Javascript中的实现,但任何其他语言或伪代码也会很好),以便在M个子集合中找到N个对象的所有可能分布? / p>
例如,给定这样的设置:
var collection = [[],[],[]];
var items = ['a','b','c']
我希望结果看起来像这样
[['a','b','c'],[],[]]
[['a','b'],['c'],[]]
[['a','c'],['b'],[]]
[['a'],['b','c'],[]]
[['b','c'],['a'],[]]
[['b'],['c','a'],[]]
[['c'],['b','a'],[]]
[['a'],['b'],['c']]
[[],['a','b','c'],[]]
[[],['a'],['b','c']]
// etc
N可以大于,小于或等于N.此外,在示例中,我使用字符作为要分发的项目,但我希望算法能够分发任何类型的对象。
答案 0 :(得分:1)
每个对象都应属于某个集合,因此存在<canvas id="my-canvas" width="80" height="210"></canvas>
变体
对于N个对象,存在M
个变体(M的N次幂)。
因此,我们可以生成范围P=M^N
中的所有数字,并将它们视为基数为M的基数
如果M-base表示中的第k个数字是j,则第k个对象属于第j个集合。
案例0..P-1
的示例
数字N=3, M=3, P=27
等于12(dec)
,因此收集
110(three-radix)
伪代码
[[a], ['b','c'],[]]