2016-11-21 3 views

答えて

9

あなたが探しているのはベクターの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'バウンドを避けることができると思います。 @MatthieuM。 –

+0

確かに!先端のための良いキャッチとありがとう。 :) – erip

2

出力の要素の順序は重要ではなく、このような出力場合:基本的な考え方は非常に単純です

[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]が許容され、あなたがこのような何かを行うことができます

  1. スタートと空のセット:[[]]

    すべての要素を、すべてのサブセットに最初の要素(1)を追加することによって更新される一時変数にコピーします。 - >[[1]]、元のベクトルにそれを追加する:[[], [1]]

  2. は、第二要素(2)について、ステップ2を実行します。[[], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]]

[[], [1], [2], [1,2]]

  • は、第三の要素(3)について、ステップ2を実行してください

    例:

    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); 
    
    } 
    
  • 関連する問題