Existe-t-il un moyen natif de vérifier si une section a des doublons? Pour l'instant, j'utilise ceci:Comment vérifier s'il y a des doublons dans une tranche?
fn has_dup<T: PartialEq>(slice: &[T]) -> bool {
for i in 1..slice.len() {
if slice[i..].contains(&slice[i - 1]) {
return true;
}
}
false
}
fn main() {
use std::ops::Not;
assert!(has_dup(&[1, 2, 3, 2, 5, 6]));
assert!(has_dup(&[1, 2, 3, 4, 5, 6]).not());
}
mais pour ce genre d'opérations de base, je n'aime pas utiliser le code à la main.
S'il n'y a pas de fonction disponible pour cela dans la bibliothèque standard, est-ce une manière d'optimiser mon code? Je sais que l'indexation de la tranche n'est pas le moyen le plus optimisé (for i in slice {}
vs for i in 0..slice.len() { slice[i] }
).
Il s'agit fondamentalement du [problème de distinction d'élément] (https://en.wikipedia.org/wiki/Element_distinctness_problem). Il y a des façons plus efficaces de le faire que de vérifier chaque élément par rapport au reste de la liste, qui est 'O (n^2)', mais aucun d'entre eux n'est implémenté dans std. Cependant, le compromis est qu'ils pourraient nécessiter plus de mémoire. Voir une approche de [suppression des dupes avec un HashSet] (https://github.com/Hoverbear/rust-rosetta/blob/master/tasks/remove-duplicate-elements/src/main.rs) sur rosetta-code. C'est à enlever vs juste vérifier mais cela devrait vous donner une idée de comment cela peut être fait. –
@PaoloFalabella Il est étrange qu'un tel algorithme de base ne soit pas dans le standard. – Boiethios
@Boiethios pourquoi croyez-vous que c'est un algorithme "de base"? Même si c'est le cas, rappelez-vous que des choses comme * génération de nombres aléatoires *, que beaucoup considèrent comme «basiques», sont fournies par une caisse. – Shepmaster