2016-11-21 57 views

回答

9

你在搜索什么叫做powerset的一个向量。

下面是生成矢量切片的powerset的代码。

fn powerset<T>(s: &[T]) -> Vec<Vec<T>> where T: Clone { 
    (0..2usize.pow(s.len() as u32)).map(|i| { 
     s.iter().enumerate().filter(|&(t, _)| (i >> t) % 2 == 1) 
          .map(|(_, element)| element.clone()) 
          .collect() 
    }).collect() 
} 

fn main() { 
    let v = vec![1,2,3]; 
    println!("{:?}", v); 
    let pset = powerset(&v); 
    println!("{:?}", pset); 
} 

看到它在行动here

如果您想引用的一个载体,以防止拷贝,你可以做一个简单的变化:

fn powerset<T>(s: &[T]) -> Vec<Vec<&T>> { 
    (0..2usize.pow(s.len() as u32)).map(|i| { 
     s.iter().enumerate().filter(|&(t, _)| (i >> t) % 2 == 1) 
          .map(|(_, element)| element) 
          .collect() 
    }).collect() 
} 

here大意。

+0

这很完美,谢谢。 – timlyo

+1

我想你可以通过返回'Vec >'来避免'Clone'绑定。 –

+0

@MatthieuM。确实!良好的接触和感谢小费。 :) – erip

2

如果输出的要素的顺序并不重要,而像这样的输出:[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]是可以接受的,你可以做这样的事情:

的基本想法很简单:

  1. 开始一个空集:[[]]

  2. 复制所有的元素以一个临时变量,将通过将第一元件(1)到每个子集被更新 - >[[1]]并添加到原始向量:[[], [1]]

  3. 执行步骤2用于第二元件(2):[[], [1], [2], [1,2]]

  4. 执行步骤2的第三元件(3):[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]]

例如:

fn powerset(s: &[i32]) -> Vec<Vec<i32>> { 
    let mut subsets: Vec<Vec<i32>> = vec![]; 
    let empty: Vec<i32> = vec![]; 
    subsets.push(empty); 

    let mut updated: Vec<Vec<i32>> = vec![]; 

    for ele in s { 
     for mut sub in subsets.clone() { 
      sub.push(*ele); 
      updated.push(sub); 
     } 
     subsets.append(&mut updated); 
    } 
    subsets 
} 

fn main() { 
    let my_vec: Vec<i32> = vec![1,2,3]; 

    let subs = powerset(&my_vec); 
    println!("{:?}", subs); 

}