In diesem Artikel untersuchen wir zwei Methoden zum Entfernen doppelter Elemente aus einem Stapel in Java. Wir vergleichen einen einfachen Ansatz mit verschachtelten Schleifen und eine effizientere Methode mit einem HashSet. Das Ziel besteht darin, zu demonstrieren, wie die Entfernung von Duplikaten optimiert werden kann, und die Leistung jedes Ansatzes zu bewerten.
Schreiben Sie ein Java-Programm, um das doppelte Element aus dem Stapel zu entfernen.
Eingang
Stackdata = initData(10L);
Ausgabe
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
Um Duplikate aus einem bestimmten Stapel zu entfernen, haben wir zwei Ansätze:
Unten ist dargestellt, wie das Java-Programm zunächst einen zufälligen Stapel erstellt und dann ein Duplikat davon zur weiteren Verwendung erstellt −
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
hilft beim Erstellen eines Stapels mit einer bestimmten Größe und zufälligen Elementen im Bereich von 1 bis 100.
manualCloneStack
hilft bei der Datengenerierung durch das Kopieren von Daten aus einem anderen Stapel und verwendet sie für den Leistungsvergleich zwischen den beiden Ideen.
Im Folgenden finden Sie die Schritte zum Entfernen von Duplikaten aus einem bestimmten Stapel mithilfe des naiven Ansatzes:
Unten finden Sie das Java-Programm zum Entfernen von Duplikaten aus einem bestimmten Stapel mithilfe des naiven Ansatzes −
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; }
Für den naiven Ansatz verwenden wir
while (!stack.isEmpty())
, um die erste Schleife zu verarbeiten, die alle Elemente im Stapel durchläuft, und die zweite Schleife ist
resultStack.contains(element)
um zu prüfen, ob das Element bereits vorhanden ist.Im Folgenden finden Sie die Schritte zum Entfernen von Duplikaten aus einem bestimmten Stapel mithilfe eines optimierten Ansatzes:
Unten finden Sie das Java-Programm zum Entfernen von Duplikaten aus einem bestimmten Stapel mithilfe von 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; }
Für einen optimierten Ansatz verwenden wir
Set seen
Um eindeutige Elemente in einem Set zu speichern, nutzen Sie die O(1)-Komplexität beim Zugriff auf ein zufälliges Element, um den Berechnungsaufwand zu reduzieren Überprüfen, ob ein Element vorhanden ist oder nicht.
Im Folgenden finden Sie die Schritte zum Entfernen von Duplikaten aus einem bestimmten Stapel mit beiden oben genannten Ansätzen:
Unten finden Sie das Java-Programm, das doppelte Elemente aus einem Stapel entfernt, indem es beide oben genannten Ansätze verwendet –
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)); } }
Ausgabe
* Die Maßeinheit ist Nanosekunde.
public static void main(String[] args) { Stackdata1 = initData( ); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2); }
Verfahren | 100 Elemente | 1000 Elemente | 10000 Elemente |
100000 Elemente |
1000000 Elemente |
Idee 1 | 693100 |
4051600 |
19026900 |
114201800 |
1157256000 |
Idee 2 | 135800 |
681400 |
2717800 |
11489400 |
36456100 |
Wie beobachtet, ist die Laufzeit für Idee 2 kürzer als für Idee 1, da die Komplexität von Idee 1 O(n²) beträgt, während die Komplexität von Idee 2 O(n) beträgt. Wenn also die Anzahl der Stapel zunimmt, erhöht sich entsprechend auch der Zeitaufwand für Berechnungen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3