gpt4 book ai didi

c# - 将 N 个元素的每个子集划分到 K 个桶中的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:47 25 4
gpt4 key购买 nike

我要实现的方法是这样的

/*
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();
}

我首先想知道是否有一些已知的(Donald Knuth?)算法可以执行此操作。请注意桶的顺序如何重要,例如我将 (1,2), (3)(3), (1,2) 视为单独的结果。

最佳答案

请注意,每个元素都可以占据 (K+1) 个位置(K 个桶和任何桶中的一个位置)。

所以有 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可能映射为:第2个桶中的第一个元素,第1个桶中的第二个元素,第三个元素关闭: [ (2), (1) ]

1610=1213: [ (1,3), (2) ]

关于c# - 将 N 个元素的每个子集划分到 K 个桶中的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com