Neste artigo, exploraremos dois métodos para remover elementos duplicados de uma pilha em Java. Compararemos uma abordagem direta com loops aninhados e um método mais eficiente usando um HashSet. O objetivo é demonstrar como otimizar a remoção de duplicatas e avaliar o desempenho de cada abordagem.
Escreva um programa Java para remover o elemento duplicado da pilha.
Entrada
Stackdata = initData(10L);
Saída
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
Para remover duplicatas de uma determinada pilha, temos 2 abordagens -
Abaixo está o programa Java que primeiro constrói uma pilha aleatória e, em seguida, cria uma duplicata dela para uso posterior -
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
ajuda a criar uma pilha com um tamanho especificado e elementos aleatórios variando de 1 a 100.
manualCloneStack
ajuda a gerar dados copiando dados de outra pilha, usando-os para comparação de desempenho entre as duas ideias.
A seguir estão as etapas para remover duplicatas de uma determinada pilha usando a abordagem Naïve -
Abaixo está o programa Java para remover duplicatas de uma determinada pilha usando a abordagem 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; }
Para abordagem ingênua, usamos
while (!stack.isEmpty())
para lidar com o primeiro loop para percorrer todos os elementos na pilha, e o segundo loop é
resultStack.contains(element)
para verificar se o elemento já está presente.A seguir estão as etapas para remover duplicatas de uma determinada pilha usando uma abordagem otimizada -
Abaixo está o programa Java para remover duplicatas de uma determinada pilha usando 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; }
Para uma abordagem otimizada, usamos
Set seen
para armazenar elementos únicos em um conjunto, aproveite a complexidade O(1) ao acessar um elemento aleatório para reduzir o custo de cálculo de verificando se um elemento está presente ou não.
Abaixo estão as etapas para remover duplicatas de uma determinada pilha usando as duas abordagens mencionadas acima -
Abaixo está o programa Java que remove elementos duplicados de uma pilha usando as duas abordagens mencionadas acima -
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)); } }
Saída
* A unidade de medida é nanossegundo.
public static void main(String[] args) { Stackdata1 = initData( ); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2); }
Método | 100 elementos | 1000 elementos | 10.000 elementos |
100.000 elementos |
1000000 elementos |
Ideia 1 | 693100 |
4051600 |
19026900 |
114201800 |
1157256000 |
Ideia 2 | 135800 |
681400 |
2717800 |
11489400 |
36456100 |
Conforme observado, o tempo de execução da Ideia 2 é menor do que o da Ideia 1 porque a complexidade da Ideia 1 é O(n²), enquanto a complexidade da Ideia 2 é O(n). Assim, quando o número de pilhas aumenta, o tempo gasto em cálculos também aumenta com base nisso.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3