查找将N个对象分配到M个集合的所有方法的算法

时间:2016-03-16 22:38:41

标签: javascript algorithm partitioning combinatorics

给定一个包含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.此外,在示例中,我使用字符作为要分发的项目,但我希望算法能够分发任何类型的对象。

1 个答案:

答案 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'],[]]