이 문서에서는 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
는 다른 스택에서 데이터를 복사하여 데이터를 생성하고 이를 두 아이디어 간의 성능 비교에 사용하는 데 도움이 됩니다.
다음은 Naïve 접근 방식을 사용하여 특정 스택에서 중복 항목을 제거하는 단계입니다. -
다음은 Naïve 접근 방식을 사용하여 주어진 스택에서 중복 항목을 제거하는 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)
요소가 이미 존재하는지 확인합니다.다음은 최적화된 접근 방식을 사용하여 특정 스택에서 중복 항목을 제거하는 단계입니다. -
다음은 HashSet -
를 사용하여 주어진 스택에서 중복 항목을 제거하는 Java 프로그램입니다.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 |
관찰한 바와 같이, 아이디어 1의 복잡성은 O(n²)인 반면 아이디어 2의 복잡성은 O(n)이기 때문에 아이디어 2의 실행 시간은 아이디어 1보다 짧습니다. 그래서 스택 수가 늘어나면 그에 따라 계산에 소요되는 시간도 늘어납니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3