2016-11-21 40 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); 

}