В этой статье мы рассмотрим два метода удаления повторяющихся элементов из стека в Java. Мы сравним простой подход с вложенными циклами и более эффективный метод с использованием HashSet. Цель — продемонстрировать, как оптимизировать удаление дубликатов, и оценить эффективность каждого подхода.
Напишите программу на Java для удаления повторяющегося элемента из стека.
Вход
Stackdata = initData(10L);
Выход
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
Чтобы удалить дубликаты из данного стека, у нас есть 2 подхода:
Ниже приведена программа на Java, которая сначала создает случайный стек, а затем создает его дубликат для дальнейшего использования —
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
помогает создать стек заданного размера и случайных элементов в диапазоне от 1 до 100.
manualCloneStack
помогает генерировать данные путем копирования данных из другого стека и использования их для сравнения производительности двух идей.
Ниже приведен шаг по удалению дубликатов из данного стека с использованием наивного подхода —
Ниже приведена Java-программа для удаления дубликатов из заданного стека с использованием наивного подхода –
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; }
Для наивного подхода мы используем
while (!stack.isEmpty())
для обработки первого цикла для прохождения всех элементов в стеке, а второй цикл —
resultStack.contains(element)
, чтобы проверить, присутствует ли элемент. Ниже приведен шаг по удалению дубликатов из данного стека с использованием оптимизированного подхода —
Ниже приведена Java-программа для удаления дубликатов из заданного стека с помощью 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; }
Для оптимизации подхода мы используем
Set seen
чтобы сохранить уникальные элементы в наборе, воспользуйтесь преимуществами O(1) сложности при доступе к случайному элементу, чтобы снизить затраты на вычисления проверка наличия элемента или его отсутствия.
Ниже приведен шаг по удалению дубликатов из данного стека с использованием обоих подходов, упомянутых выше:
Ниже представлена программа на Java, которая удаляет повторяющиеся элементы из стека, используя оба упомянутых выше подхода –
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)); } }
Выход
* Единица измерения — наносекунда.
public static void main(String[] args) { Stackdata1 = initData( ); Stack data2 = manualCloneStack(data1); idea1(data1); idea2(data2); }
Метод | 100 элементов | 1000 элементов | 10000 элементов |
100000 элементов |
1000000 элементов |
Идея 1 | 693100 |
4051600 |
19026900 |
114201800 |
1157256000 |
Идея 2 | 135800 |
681400 |
2717800 |
11489400 |
36456100 |
Как уже отмечалось, время реализации идеи 2 короче, чем для идеи 1, поскольку сложность идеи 1 равна O(n²), а сложность идеи 2 — O(n). Так вот, когда количество стеков увеличивается, время, затрачиваемое на расчеты, тоже увеличивается на его основе.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3