Melhor maneira de remover elementos do Vec, dependendo de outros elementos do mesmo Vec
Eu tenho um vetor de conjuntos e quero remover todos os conjuntos que são subconjuntos de outros conjuntos no vetor. Exemplo:
a = {0, 3, 5}
b = {0, 5}
c = {0, 2, 3}
Neste caso, gostaria de removerb
, porque é um subconjunto dea
. Estou bem com o uso de um algoritmo "burro" n².
Infelizmente, é bastante complicado fazê-lo funcionar com o verificador de empréstimos. O melhor que eu criei é (Parque infantil):
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);
}
(Nota: o código acima não está correto! Veja os comentários para mais detalhes)
Vejo algumas desvantagens:
Preciso de um vetor adicional com alocações adicionaisTalvez haja maneiras mais eficientes do que telefonarswap_remove
frequentementeSe eu precisar preservar a ordem, não posso usarswap_remove
, mas tem que usarremove
o que é lentoExiste uma maneira melhor de fazer isso? Não estou apenas perguntando sobre meu caso de uso, mas sobre o caso geral, conforme descrito no título.