-
[자료구조] Queue의 구현체 (우선순위 큐)자료구조 2024. 4. 28. 20:11
- 말하기에 앞서 Queue는 interface 형태로 Collection 클래스를 상속하고 있다
- 자료구조 중에서 선형구조인 큐는 일반 큐와 우선순위 큐로 나뉘어진다
선형구조(Linear Structure), 큐(Queue)
💡 선형 구조
- 데이터를 저장하기 위한 기본적인 형태로 데이터가 일렬로 나열 되어 있을 뿐만 아니라 데이터 간에 순서가 있고 논리적으로 이어져 있는 구조를 의미한다
💡 큐
- 큐는 선입선출의 특성을 가지고 있다
큐에 대해서 좀 더 자세하게 알고 싶으면 아래 포스팅을 확인하면 된다
https://hyeonni.tistory.com/24
Queue란? from java
Queue 란? Queue란? 사전적 의미로는 대기줄이다이러한 사전 적 의미 처럼 queue는 차례대로 처리된다큐는 후입선출(LIFO)인 스택과 다르게 선입선출(FIFO)의 형태를 가진다선입선출 말 그대로 먼저
hyeonni.tistory.com
큐의 구현체
LinkedList(연결 리스트)
- 일단 Java에서 제공하는 Queue는 interface 형태로 연결 리스트(LinkedList)를 통해서 생성한다
- 그래서 사이즈가 가변적이고 쉽게 데이터를 삭제, 추가 할 수 있다
import java.util.Queue; import java.util.LinkedList; Queue<T> queue = new LinkedList<>(); // T 타입 queue 선언
💡연결 리스트 (LinkedList)
- ArrayList처럼 데이터들을 연속적으로 배열 시키지 않고 임의의 기억공간에 기억시키되 자료 항목의 순서에 따라 노드의 포인터 부분을 이용하여 서로 연결 시킨 구조이다
list Priority Queue(우선순위 큐)
- 우선 순위 큐는 이름 처럼 큐의 성질을 가졌다
- 하지만 각 데이터가 우선순위를 가지고 있어 우선순위가 높은 순서대로 데이터를 처리를 해주는 큐이다
- 만약에 우선순위가 동일하다고 하면 그땐 순서에 의해 처리된다
- 우선 순위 큐는 null을 저장하면 NullPointException이 발생한다
- 위 사진 처럼 PriorityQueue는 저장 공간으로 배열을 사용한다
- 그리고 각 요소를 heap(힙) 이라는 자료구조의 형태로 저장한다
- 어떤 객체의 내부 속성에 대해서 어떤 기준으로 정렬하고 싶으면 Comparable 인터페이스의 compareTo 메소드를 구현 하면 된다
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
- 정렬 기준의 순서대로 poll() 하는 경우 즉, 데이터를 빼는 경우 우선순위가 높은 것 부터 나오게 된다
- 즉, 작은 숫자가 더 높은 우선순위를 갖도록 설정되어 있다 -> 작은 숫자가 먼저 추출된다
- 만약! 우선순위를 역순으로 하여 정렬하고 싶으면 아래 코드 처럼 하면 된다
Queue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
💡힙(heap)- 최대 혹은 최솟값을 빠르게 찾기 위한 자료구조
- Heap 은 특정한 순서에 따라 정렬된 요소들을 저장하는 트리 기반의 자료구조이다
- Heap 은 일반적으로 binary heap 으로 구현되고 위 처럼 Priority Queue 의 구현에 주로 사용된다
사용법
선언
import java.util.PriorityQueue; //String형 priorityQueue 선언 (우선순위가 높은 숫자 순) PriorityQueue<String> priorityQueue = new PriorityQueue<>(); //String형 priorityQueue 선언 (우선순위가 낮은 숫자 순) PriorityQueue<String> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
값 추가
priorityQueue.add(3); priorityQueue.offer(1); priorityQueue.add(2); System.out.println(priorityQueue) // 출력결과 -> 1,3,2 while (!priorityQueue.isEmpty()) { System.out.println(priorityQueue.poll()); } // 출력 결과 // 1 // 2 // 3
- 추가 하려면 일반적인 큐의 메서드 add(), offer()를 사용하면 된다
- 위 코드를 보면 출력 결과가 다르다 큐의 내부를 보려고 System.out.println 으로 출력하면 결과가 1,3,2 가 되고 poll() 함수로 데이터를 꺼내면 출력 순서가 1, 2, 3이된다
이 이유는 무엇일까?
- 이유는 우선순위 큐는 힙 구조로 완전 이진 트리의 일종이다
아래 그림 순서를 보고 설명하겠다
- 처음에는 그림 처럼 3이 추가가 되었다
- 그리고 1이 추가 되었을때는 일단 끝에다가 추가를 한다
그 후에 부모노드 즉, 루트 노드와 비교를 한다
- 1이 3 보다 우선순위가 높으니 swap
- 2가 추가 되었다 이번에도 마찬가지로 제일 뒤쪽에 추가를 한다
그리고 2도 루트노드와 비교를 한다
-> 2는 1보다 우선순위가 낮으므로 교체가 되지 않고 그대로 둔다
이런 이유로 큐 내부에서는 print()문을 사용해 보면 [1, 3, 2]가 출력이 된다
이렇게 해서 우선순위 큐의 내부 데이터가 어떤식으로 추가가 되는지 알 수 있었다.
값 제거
priorityQueue.poll(); // priorityQueue에 첫번째 값을 반환하고 제거 비어있다면 null priorityQueue.remove(); // priorityQueue에 첫번째 값 제거 priorityQueue.clear(); // priorityQueue에 초기화
우선순위가 가장 높은 값 출력
priorityQueue.peek(); // priorityQueue에 첫번째 값 참조 = 1
'자료구조' 카테고리의 다른 글
[자료구조] 신장 트리 (0) 2024.08.31 [자료구조] 그래프(Graph) (0) 2024.06.10 [자료구조] 힙(Heap) 이란 뭘까? (0) 2024.05.09 [자료구조] Deque란? from Java (1) 2024.04.27 [자료구조] Queue란? from java (1) 2024.04.27