【问题标题】:Algorithm to find all ways to distribute N objects into M collections找到将 N 个对象分配到 M 个集合中的所有方法的算法
【发布时间】:2016-03-16 22:38:41
【问题描述】:

给定一个包含 M 个子集合的集合,有什么好的算法(最好是用 Javascript 实现,但任何其他语言或伪代码也可以)找到 N 个对象的所有可能分布到 M 个子集合中?

例如,给定这样的设置:

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。此外,在示例中,我使用字符作为要分发的项目,但我希望算法能够分发任何对象输入。

【问题讨论】:

  • 算法不是“在”一种语言。算法的实现是特定的语言。无论如何,你的问题太宽泛了。不要要求每个人解决你的整个工作。自己做,只询问你卡住的特定部分。
  • 我认为我在下面发布的算法应该可以满足您的需求。如果@JK 能确认我是否正确,那就太好了。

标签: javascript algorithm partitioning combinatorics


【解决方案1】:

每个对象都应该属于某个集合,因此存在M 变体。
对于 N 个对象,有 P=M^N 个变体(M 的 N 次方)。

因此我们可以生成0..P-1 范围内的所有数字,并将它们视为 M 基基数。
如果 M 基表示中数字的第 k 位是 j,则第 k 个对象属于第 j 个集合。

您的案例示例N=3, M=3, P=27 数字12(dec) 等于110(three-radix),所以集合是

[[a], ['b','c'],[]]

伪代码

for iii = 0 to Power(M, N) - 1
    Clear Collections
    i = iii //number of combination

    for k = 0 to N - 1 do

        j = i mod M     //integer modulo, % 
        //gives k-th digit of number i in M-radix representation
        //counting from right to left

        Collections[j].Add(Object[k])

        i = i div M     //integer division
    output Collections 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    相关资源
    最近更新 更多