Rustのベクターのすべてのサブセットを取得する最も簡単で最も慣用的な方法は何ですか?Rustでベクトルのすべてのサブセットを取得する方法は?
let v = vec![1,2,3];
assert_eq!(subsets(v), [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]);
Rustのベクターのすべてのサブセットを取得する最も簡単で最も慣用的な方法は何ですか?Rustでベクトルのすべてのサブセットを取得する方法は?
let v = vec![1,2,3];
assert_eq!(subsets(v), [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]);
あなたが探しているのはベクターの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を参照してください。
出力の要素の順序は重要ではなく、このような出力場合:基本的な考え方は非常に単純です
:[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
が許容され、あなたがこのような何かを行うことができます
スタートと空のセット:[[]]
すべての要素を、すべてのサブセットに最初の要素(1
)を追加することによって更新される一時変数にコピーします。 - >[[1]]
、元のベクトルにそれを追加する:[[], [1]]
は、第二要素(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);
}
これは完璧です。ありがとうございます。 – timlyo
'Vec'を返すことで、 'Clone'バウンドを避けることができると思います。 @MatthieuM。 –
確かに!先端のための良いキャッチとありがとう。 :) – erip