Dans cet article, nous explorerons deux méthodes pour supprimer les éléments en double d'une pile en Java. Nous comparerons une approche simple avec des boucles imbriquées et une méthode plus efficace utilisant un HashSet. L'objectif est de démontrer comment optimiser la suppression des doublons et d'évaluer les performances de chaque approche.
Écrivez un programme Java pour supprimer l'élément en double de la pile.
Saisir
Stackdata = initData(10L);
Sortir
Unique elements using Naive Approach: [1, 4, 3, 2, 8, 7, 5] Time spent for Naive Approach: 18200 nanoseconds Unique elements using Optimized Approach: [1, 4, 3, 2, 8, 7, 5] Time spent for Optimized Approach: 34800 nanoseconds
Pour supprimer les doublons d'une pile donnée, nous avons 2 approches −
Ci-dessous, le programme Java construit d'abord une pile aléatoire, puis en crée une copie pour une utilisation ultérieure -
private static Stack initData(Long size) { Stack stack = new Stack (); Random random = new Random(); int bound = (int) Math.ceil(size * 0.75); for (int i = 0; i manualCloneStack(Stack stack) { Stack newStack = new Stack (); for (Integer item: stack) { newStack.push(item); } return newStack; }
initData
aide à créer une pile avec une taille spécifiée et des éléments aléatoires allant de 1 à 100.
manualCloneStack
aide à générer des données en copiant les données d'une autre pile, en les utilisant pour comparer les performances entre les deux idées.
Voici l'étape pour supprimer les doublons d'une pile donnée en utilisant l'approche naïve −
Vous trouverez ci-dessous le programme Java pour supprimer les doublons d'une pile donnée en utilisant l'approche Naïve −
public static Stack idea1(Stack stack) { long start = System.nanoTime(); Stack resultStack = new Stack (); while (!stack.isEmpty()) { int element = stack.pop(); if (!resultStack.contains(element)) { resultStack.add(element); } } System.out.println("Time spent for idea1 is %d nanosecond".formatted(System.nanoTime() - start)); return resultStack; }
Pour l'approche Naive, nous utilisons
while (!stack.isEmpty())
pour gérer la première boucle pour parcourir tous les éléments de la pile, et la deuxième boucle est
resultStack.contains(element)
pour vérifier si l'élément est déjà présent.Voici l'étape pour supprimer les doublons d'une pile donnée en utilisant une approche optimisée −
Vous trouverez ci-dessous le programme Java pour supprimer les doublons d'une pile donnée à l'aide de HashSet −
public static Stackidea2(Stack stack) { long start = System.nanoTime(); Set seen = new HashSet(); Stack tempStack = new Stack(); while (!stack.isEmpty()) { int element = stack.pop(); if (!seen.contains(element)) { seen.add(element); tempStack.push(element); } } System.out.println("Time spent for idea2 is %d nanosecond".formatted(System.nanoTime() - start)); return tempStack; }
Pour une approche optimisée, nous utilisons
Set seen
pour stocker des éléments uniques dans un ensemble, profitez de la complexité O(1) lors de l'accès à un élément aléatoire pour réduire le coût de calcul de vérifier si un élément est présent ou non.
Vous trouverez ci-dessous l'étape pour supprimer les doublons d'une pile donnée en utilisant les deux approches mentionnées ci-dessus -
Vous trouverez ci-dessous le programme Java qui supprime les éléments en double d'une pile en utilisant les deux approches mentionnées ci-dessus −
import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.Stack; public class DuplicateStackElements { private static StackinitData(Long size) { Stack stack = new Stack(); Random random = new Random(); int bound = (int) Math.ceil(size * 0.75); for (int i = 0; i cloneStack(Stack stack) { Stack newStack = new Stack(); newStack.addAll(stack); return newStack; } public static Stack idea1(Stack stack) { long start = System.nanoTime(); Stack resultStack = new Stack(); while (!stack.isEmpty()) { int element = stack.pop(); if (!resultStack.contains(element)) { resultStack.add(element); } } System.out.printf("Time spent for idea1 is %d nanoseconds%n", System.nanoTime() - start); return resultStack; } public static Stack idea2(Stack stack) { long start = System.nanoTime(); Set seen = new HashSet(); Stack tempStack = new Stack(); while (!stack.isEmpty()) { int element = stack.pop(); if (!seen.contains(element)) { seen.add(element); tempStack.push(element); } } System.out.printf("Time spent for idea2 is %d nanoseconds%n", System.nanoTime() - start); return tempStack; } public static void main(String[] args) { Stack data1 = initData(10L); Stack data2 = cloneStack(data1); System.out.println("Unique elements using idea1: " idea1(data1)); System.out.println("Unique elements using idea2: " idea2(data2)); } }
Sortir
* L'unité de mesure est la nanoseconde.
public static void main(String[] args) { Stackdata1 = initData( ); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2); }
Méthode | 100 éléments | 1000 éléments | 10000 éléments |
100 000 éléments |
1 000 000 éléments |
Idée 1 | 693100 |
4051600 |
19026900 |
114201800 |
1157256000 |
Idée 2 | 135800 |
681400 |
2717800 |
11489400 |
36456100 |
Comme observé, le temps d'exécution de l'idée 2 est plus court que celui de l'idée 1 car la complexité de l'idée 1 est O(n²), tandis que la complexité de l'idée 2 est O(n). Ainsi, lorsque le nombre de piles augmente, le temps consacré aux calculs augmente également en fonction de celui-ci.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3