我有一組向量,我想要刪除向量中其他集的子集的所有集。例如:取決於Vec的其他元素的最佳方式取決於Vec的其他元素
a = {0, 3, 5}
b = {0, 5}
c = {0, 2, 3}
在這種情況下,我想刪除b
,因爲它是a
一個子集。我很喜歡使用「啞」n²算法。
不幸的是,使用借用檢查器來處理它非常棘手。我想出的最好的是(Playground):
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
這是慢
有沒有更好的方式來做到這一點?我不只是在詢問我的用例,而是在標題中描述的一般情況。
該算法不正確;它僅刪除矢量中的*集*的子集。示例:https://play.rust-lang.org/?gist=88e20f4386f3d5df3fe57fe3a1372dfa&version=stable&backtrace=0 –
注意:保留順序並避免重新分配可以通過構建一個臨時(並按順序)來實現,然後將其與原始。目前還不清楚到底是什麼引爆點。 –
這裏是保存命令的一個要求嗎?如果不是的話,我會先按大小對矢量進行排序,這樣就可以避免必須對子集進行雙向檢查(並刪除正確的子集)。 –