Vector 检查Vec是否包含来自其他Vec的所有元素
有一种方法可用于检查Vector 检查Vec是否包含来自其他Vec的所有元素,vector,collections,rust,Vector,Collections,Rust,有一种方法可用于检查Vec中是否存在特定元素。如何检查一个Vec中的所有元素是否包含在另一个Vec中?还有比手动迭代和显式检查所有元素更简洁的方法吗?您还可以对向量进行排序,然后测试它们是否相等: fn main() { let mut v1 = vec![2, 3, 1]; let mut v2 = vec![3, 1, 2]; v1.sort(); v2.sort(); assert_eq!(v1, v2); } 您有两个主要选择: 天
Vec
中是否存在特定元素。如何检查一个Vec
中的所有元素是否包含在另一个Vec
中?还有比手动迭代和显式检查所有元素更简洁的方法吗?您还可以对向量进行排序,然后测试它们是否相等:
fn main() {
let mut v1 = vec![2, 3, 1];
let mut v2 = vec![3, 1, 2];
v1.sort();
v2.sort();
assert_eq!(v1, v2);
}
您有两个主要选择:
- 天真地检查一个向量中的每个元素,看看它是否在另一个向量中。这具有时间复杂度O(n^2),但也非常简单且开销较低:
assert!(b.iter().all(|item| a.contains(item)));
- 创建其中一个向量的所有元素的集合,然后检查其中是否包含另一个向量的元素。这具有O(n)时间复杂性,但包括额外堆分配在内的更高开销:
let a_set: HashSet<_> = a.iter().copied().collect(); assert!(b.iter().all(|item| a_set.contains(item)));
let a_set:HashSet=a.iter().copied().collect(); 断言!(b.iter().all(| item | a|u set.contains(item));
b树集
进行测试,该树集与哈希集
具有不同的性能特征
下面是一些粗略的基准测试()说明了实现如何随输入的大小而变化。在所有测试中,
b
是a
的一半大小,并且包含a
元素的随机子集:
a的大小
Vec::contains
HashSet::contains
BtreeSet::contains
10
14
386
327
100
1,754
3,187
5,371
1000
112,306
31,233
88,340
10000
2,821,867
254,801
728,268
100000
29,207,999
2,645,703
6,611,666
看起来还不错。另一种选择是在or中加载,并使用is\u子集/is\u超集。这将有更高的常量开销,但它应该是线性的,而不是二次的,如果集合相当大,这可能是个好主意。@mcarton实际上,但我使用过的几乎所有语言都有现成的东西。所以我问,万一我漏掉了什么东西,有什么方法可以解决这个问题。真的吗?我不知道有哪种语言支持开箱即用的向量数据结构的子集检查。对于集合数据结构,当然可以,但不是向量。@SvenMarnach至少要注意,他们询问的是子集,而不仅仅是相等,例如,
v1
可能只有1
和3
,但不是2
。