Moyen plus élégant de vérifier les doublons dans le tableau C ++?
J'ai écrit ce code en C++ dans le cadre d'un uni tâche où j'en ai besoin pour s'assurer qu'il n'y a pas de doublons dans un tableau:
//Check for duplicate numbers in user inputted data
int i; //Need to declare i here so that it can be accessed by the 'inner' loop that starts on line 21
for(i = 0;i < 6; i++) { //Check each other number in the array
for(int j = i; j < 6; j++) { //Check the rest of the numbers
if(j != i) { //Makes sure don't check number against itself
if(userNumbers[i] == userNumbers[j]) {
b = true;
}
}
if(b == true) { //If there is a duplicate, change that particular number
cout << "Please re-enter number " << i + 1 << ". Duplicate numbers are not allowed:" << endl;
cin >> userNumbers[i];
}
} //Comparison loop
b = false; //Reset the boolean after each number entered has been checked
} //Main check loop
Il fonctionne parfaitement, mais j'aimerais savoir si il y a plus d'élégance ou de moyen efficace pour vérifier.
source d'informationauteur Saladin Akara
Vous devez vous connecter pour publier un commentaire.
Vous pouvez trier le tableau en O(nlog(n)), alors il suffit de regarder jusqu'à ce que le prochain numéro. Qui est considérablement plus rapide que votre O(n^2) algorithmes existants. Le code est beaucoup plus propre. Votre code n'est pas de garantir l'absence de doublons ont été insérés lorsqu'ils étaient entrés à nouveau. Vous devez éviter les doublons existants, en premier lieu.
J'ai aussi la deuxième reccomendation d'utiliser un std::set - pas de doublons.
La solution suivante est basée sur le tri le nombre, puis en supprimant les doublons:
En effet, la manière la plus rapide et aussi loin que je peux voir le plus élégant de la méthode est comme conseillé ci-dessus:
Il est O(n log n). Ceci cependant ne pas le faire, si l'ordre des nombres dans le tableau d'entrée doit être maintenu... Dans ce cas j'ai fait:
qui est toujours en O(n log n) et conserve l'original de l'ordre des éléments dans
tUserNumbers
.Acclamations,
Paul
Vous pouvez ajouter tous les éléments d'un ensemble et de vérifier lors de l'ajout si il est déjà présent ou non. Ce serait plus élégant et efficace.
Il est dans le prolongement de la réponse par @Chiot, qui est actuellement la meilleure réponse.
PS : j'ai essayé d'insérer ce message comme commentaire dans l'actuelle meilleure réponse par @Chiot, mais ne pouvait pas, de sorte que je n'ai pas de 50 points encore. Aussi un peu de données expérimentales est partagé ici pour obtenir de l'aide.
À la fois std::set et std::map sont mis en œuvre dans la STL à l'aide Équilibré arbre de Recherche Binaire. Donc, les deux conduisent à une complexité de O(nlogn) uniquement dans ce cas. Alors que la meilleure performance peut être atteint que si une table de hachage est utilisée. std::unordered_map offre table de hachage basée sur la mise en œuvre pour une recherche plus rapide. J'ai testé avec tous les trois de mise en œuvre et les résultats en utilisant std::unordered_map être mieux que les std::set et std::map. Les résultats et le code sont présentées ci-dessous. Les Images sont l'instantané de la performance mesurée par LeetCode sur les solutions.
unordered_map de Performance (temps d'Exécution était de 52 ms ici)
Set/Carte Performance

Je ne suis pas sûr de savoir pourquoi cela n'a pas été suggéré, mais ici c'est encore une façon de base est de 10 à rechercher des doublons dans O(n).. Le problème que je vois avec la déjà suggéré O(n) solution est qu'elle nécessite que les chiffres seront triés en premier lieu.. Cette méthode est O(n) et ne nécessite pas le jeu d'être triés. Le truc cool, c'est que la vérification si un chiffre a des doublons est O(1). Je sais que ce fil est probablement mort, mais peut-être que ça va aider quelqu'un! 🙂
C'est ok, spécialement pour les petites matrice des longueurs. Je ne l'utiliserais plus efficace aproaches (moins de n^2/2 comparaisons) si le tableau est mugh grand de voir DeadMG de réponse.
Quelques petites corrections pour votre code:
int j = i
écrireint j = i +1
et vous pouvez les omettre de votreif(j != i)
testi
variable en dehors de lafor
déclaration.