Algorithm 如何将集合的元素分组为N个部分的所有组合?

Algorithm 如何将集合的元素分组为N个部分的所有组合?,algorithm,rust,vec,Algorithm,Rust,Vec,我遇到了一个看似简单但实际上很难的问题。它似乎是一个组合算法的子集。有更快更直接的算法吗 /// split the group {v1} to {n} parts /// /// For example: /// Group(here represented by an array): /// [1, 2, 3, 4] /// split Group to 2 part, got: /// [[1], [2, 3, 4]] /// [[1, 2], [3, 4]] ///

我遇到了一个看似简单但实际上很难的问题。它似乎是一个组合算法的子集。有更快更直接的算法吗

/// split the group {v1} to {n} parts
///
/// For example:
///  Group(here represented by an array):
///   [1, 2, 3, 4]
///  split Group to 2 part, got:
///   [[1], [2, 3, 4]]
///   [[1, 2], [3, 4]]
///   [[1, 3], [2, 4]]
///   [[1, 4], [2, 3]]
///   [[1, 2, 3], [4]]
fn split_group(v1: Vec<i32>, n: i32) -> Vec<Vec<Vec<i32>>> {
    unimplemented!()
}

fn main() {
    let mut v1 = vec![1, 2, 3, 4];
    let v2 = split_group(v1, 2);
    assert_eq!(
        v2,
        vec![
            vec![vec![1], vec![2, 3, 4]],
            vec![vec![1, 2], vec![3, 4]],
            vec![vec![1, 3], vec![2, 4]],
            vec![vec![1, 4], vec![2, 3]],
            vec![vec![1, 2, 3], vec![4]],
        ]
    );
}
///将组{v1}拆分为{n}个部分
///
///例如:
///组(此处由数组表示):
///   [1, 2, 3, 4]
///将组拆分为两部分,得到:
///   [[1], [2, 3, 4]]
///   [[1, 2], [3, 4]]
///   [[1, 3], [2, 4]]
///   [[1, 4], [2, 3]]
///   [[1, 2, 3], [4]]
fn分割组(v1:Vec,n:i32)->Vec{
未执行!()
}
fn main(){
让mut v1=vec![1,2,3,4];
设v2=split_组(v1,2);
断言(
v2,
维克[
vec![vec![1],vec![2,3,4]],
vec![vec![1,2],vec![3,4]],
vec![vec![1,3],vec![2,4]],
vec![vec![1,4],vec![2,3]],
vec![vec![1,2,3],vec![4]],
]
);
}

这是一个由@MBo链接而来的解决方案

递归函数用N个值填充K个部分

lastfilled
参数有助于避免重复-它提供了每个零件前导(最小)元素的递增顺序

empty
参数用于避免空零件

使用std::cmp;
发布fn genp(部分:&mut-Vec,mut-empty:usize,n:usize,k:usize,m:usize,lastfilled:Option){
如果m==n{
返回println!(“{:?}”,零件);
}
让mut start=0;
如果n-m==空{
开始=k-空;
}
设max=match lastfilled{
无=>1,
一些(lastfilled)=>lastfilled+2,
};
对于开始时的i..cmp::min(k,max){
零件[i]。推力(m);
如果零件[i].len()==1{
空-=1;
}
genp(部分,空,n,k,m+1,cmp::max(部分(i),最后填充));
部分[i].pop();
如果零件[i]为空(){
空+=1;
}
}
}
pub fn split_group(v1:Vec,k:usize){
让mut部分:Vec=Vec::new();
对于0..k中的uu{
push(Vec::new());
}
genp(&mut parts,k,v1.len(),k,0,None);
}

您应该将这篇回答文章移到重复的问题,该问题要求使用Kotlin代码并得到Python的答案。然后我们可以把这个问题作为一个例子来结束duplicate@Shepmaster这个答案是问斯特林数。MBo的解决方案恰好也回答了这个问题。此外,这个问题是特定的。那算是重复的吗?
fn main() {
    let v1 = vec![1, 2, 3, 4];
    split_group(v1, 2);
}

[[0, 1, 2], [3]]
[[0, 1, 3], [2]]
[[0, 1], [2, 3]]
[[0, 2, 3], [1]]
[[0, 2], [1, 3]]
[[0, 3], [1, 2]]
[[0], [1, 2, 3]]