我有一个集合向量,需要移除其中所有是其他集合子集的集合。例如:
a = {0, 3, 5}
b = {0, 5}
c = {0, 2, 3}
在这种情况下,我想删除
b
,因为它是a
的子集。我可以使用一个“愚蠢”的n²算法,但是很不幸,用借用检查器使其正常工作非常棘手。我能想到的最好方法是(示例代码):let mut v: Vec<HashSet<u8>> = vec![];
let mut to_delete = Vec::new();
for (i, set_a) in v.iter().enumerate().rev() {
for set_b in &v[..i] {
if set_a.is_subset(&set_b) {
to_delete.push(i);
break;
}
}
}
for i in to_delete {
v.swap_remove(i);
}
(注意:上面的代码不正确!请查看注释以获取更多详细信息)
我发现有几个缺点:
- 我需要一个额外的向量来进行附加分配。
- 可能有更有效的方法,而不是经常调用
swap_remove
。 - 如果我需要保留顺序,则无法使用
swap_remove
,而必须使用慢速的remove
。
是否有更好的方法来解决这个问题? 我不仅仅询问我的用例,还涉及到标题描述的一般情况。