如何在 Rust 中获取向量的每个子集? [英] How to get every subset of a vector in Rust?

查看:58
本文介绍了如何在 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(s: &[T]) ->Vec <Vec <T >其中 T:克隆 {(0..2usize.pow(s.len() as u32)).map(|i| {s.iter().enumerate().filter(|&(t, _)| (i >> t) % 2 == 1).map(|(_, element)| element.clone()).搜集()}).搜集()}fn 主(){让 v = vec![1,2,3];println!("{:?}", v);让 pset = powerset(&v);println!("{:?}", pset);}

此处查看实际效果.

如果你想要一个引用向量来防止复制,你可以做一个简单的改变:

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

请参阅此处了解要点.>

What's the easiest/most idiomatic way to get every subset of a vector in Rust?

let v = vec![1,2,3];
assert_eq!(subsets(v), [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]);

解决方案

What you're searching for is called the powerset of a vector.

Here's the code to generate the powerset of a slice of a vector.

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);
}

See it in action here.

If you'd like a vector of references in order to prevent copies, you could make a simple change:

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()
} 

See here for gist.

这篇关于如何在 Rust 中获取向量的每个子集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆