C# N个元素子集划分为K个桶的算法
我尝试实现的方法如下C# N个元素子集划分为K个桶的算法,c#,algorithm,C#,Algorithm,我尝试实现的方法如下 /* e.g. {1, 2, 3}, k = 2 ---> [ (), () ], [ (1), () ], [ (), (1) ], [ (2), () ], [ (), (2) ], [ (3), () ], [ (), (3) ], [ (1), (2) ], [ (2), (1) ],
/*
e.g. {1, 2, 3}, k = 2
--->
[ (), () ],
[ (1), () ],
[ (), (1) ],
[ (2), () ],
[ (), (2) ],
[ (3), () ],
[ (), (3) ],
[ (1), (2) ],
[ (2), (1) ],
[ (1), (3) ],
[ (3), (1) ],
[ (2), (3) ],
[ (3), (2) ],
[ (1,2), () ],
[ (2,3), () ],
[ (1,3), () ],
[ (), (1,2) ],
[ (), (1,3) ],
[ (), (2,3) ],
[ (1,2), (3) ],
[ (2,3), (1) ],
[ (1,3), (2) ],
[ (3), (1,2) ],
[ (1), (2,3) ],
[ (2), (1,3) ],
[ (1,2,3), () ],
[ (), (1,2,3,) ]
*/
public static List<List<T>> SpecialPartition<T>(this List<T> source, int k)
{
throw new NotImplementedException();
}
/*
e、 g.{1,2,3},k=2
--->
[ (), () ],
[ (1), () ],
[ (), (1) ],
[ (2), () ],
[ (), (2) ],
[ (3), () ],
[ (), (3) ],
[ (1), (2) ],
[ (2), (1) ],
[ (1), (3) ],
[ (3), (1) ],
[ (2), (3) ],
[ (3), (2) ],
[ (1,2), () ],
[ (2,3), () ],
[ (1,3), () ],
[ (), (1,2) ],
[ (), (1,3) ],
[ (), (2,3) ],
[ (1,2), (3) ],
[ (2,3), (1) ],
[ (1,3), (2) ],
[ (3), (1,2) ],
[ (1), (2,3) ],
[ (2), (1,3) ],
[ (1,2,3), () ],
[ (), (1,2,3,) ]
*/
公共静态列表SpecialPartition(此列表源,int k)
{
抛出新的NotImplementedException();
}
我首先想知道是否有一些已知的(Donald Knuth?)算法可以做到这一点。注意桶的顺序是怎样的,例如,我考虑<代码>(1,2),(3)< /代码>和<代码>(3),(1,2)< /代码>作为单独的结果。 < P>注意,每个元素都可以占用一个<代码>(K+ 1)< /代码>位置(k桶和任何桶中的一个位置)。p> 因此有
M=(K+1)^N个
组合(这里(2+1)^3=27个变体
),范围0..M-1
中的每个数字对应唯一的组合(一对一映射)
所以,生成所有组合的简单方法是对范围0..M-1
进行循环,并在(K+1)进制数字系统中表示循环计数器
for C = 0..M-1
d = C
for i = 0..N-1
Bucket for i-th element = d %% (K+1)
d = d / (K+1)
例如,2110=2103可能被映射:第二个bucket中的第一个元素、第一个bucket中的第二个元素以及第三个元素处于关闭状态:[(2)、(1)]
1610=1213:[(1,3)、(2)]