우선순위 큐(Priority Queue)
기존의 선입선출(FIFO) 방식인 큐(queue)와는 달리 우선순위가 높은 데이터부터 나오는 구조.
이 우선순위는 사용자가 정한다.
구현 방법
- 배열(array)을 이용한 구현
- 연결 리스트(linked list)를 이용한 구현
- 힙(heap)을 이용한 구현
배열과 연결 리스트를 이용하면 손쉽게 우선순위 큐를 구현할 수 있지만 각각 명확한 단점이 존재하는데,
표현 방법 |
삽입 |
삭제 |
순서없는 배열 |
O(1) |
O(n) |
순서없는 연결리스트 |
O(1) |
O(n) |
정렬된 배열 |
O(n) |
O(1) |
정렬된 연결 리스트 |
O(n) |
O(1) |
힙(heap) |
O(logn) |
O(logn) |
위 표처럼 힙(heap)을 사용하여 구현하는 것이 가장 효율적이다.
힙(heap)
힙(heap)이란 완전 이진트리의 한 종류로 우선순위 큐를 위해 만들어진 자료구조이다.
특징
- 여러 개의 값들 중에서 최대값이나 최솟값을 빠르게 찾아내는 것이 가능하다(최대 힙, 최소 힙)
- 부모 노드과 자식 노드과의 상-하 관계가 존재하지만 자식 노드(좌-우)간에 관계는 없다(반정렬 상태)
- 이진 탐색 트리와는 다르게 중복 값도 허용.
- 노드 A[n]의 왼쪽, 오른쪽 자식노드와 부모노드의 인덱스를 O(1) 시간에 연산
종류
-
최대 힙(Max Heap)
- 부모 노드 키 값 >= 자식 노드 키 값 ==> 루트 노드 최대값
-
최소 힙(Min Heap)
- 부모 노드 키 값 <= 자식 노드 키 값 ==> 루트 노드 최소값
구현
- 구현은 보통 배열을 이용하여 구현한다.
- 구현의 편의성을 위해 배열의 0번 째 인덱스는 비워놓고 1번 인덱스부터 추가한다(1번 = 루트 노드의 키)
- 부모 노드와 자식 노드의 인덱스
- parent_index = left or right_child / 2
- left_child = parent_index * 2
- right_child = (parent_index * 2) + 1
heap.c