Search
Duplicate
🎟️

Priority Queue, Heap

1. 우선순위 큐란?

정의
우선순위가 높은 것을 가장 먼저 꺼내기 위해 만들어진 자료구조, 즉 우선순의의 개념을 큐에 도입한 자료 구조다.
일반적으로 어떠한 자료구조를 명시하는 것이 아니고 추상적인 자료구조로 Heap을 사용해서 구현한다.
데이터들이 우선순위를 가지고 있고 우선순위가 높은 데이터가 먼저 제거된다.
자료구조
삭제되는 요소
스택
가장 마지막에 들어온 데이터
가장 처음에 들어온 데이터
우선순위 큐
가장 우선순위가 높은 데이터
숫자가 클수록 우선순위가 높으면 최대힙, 낮을수록 우선순위가 높으면 최소힙이라 부른다.
사례
시뮬레이션 시스템
네트워크 트래픽 제어
운영체제에서의 작업 스케쥴링
수치 해석적인 계산
구현
우선순위 큐는 배열, 연결리스트, 힙으로 구현 가능하다. 이 중에서 힙으로 구현하는 것이 가장 효율적이다.
구현
삽입 시 시간복잡도
추출 시 시간복잡도
설명
정렬된 배열
O(n)
O(1)
삽입 시 비교하며 삽입, 추출은 단순 추출
정렬된 리스트
O(n)
O(1)
삽입 시 비교하며 삽입, 추출은 단순 추출
O(logn)
O(logn)
삽입 / 추출 시 기존 정렬 상태 유지
힙이란
정의
완전 이진 트리의 일종으로 우선순위 큐를 위해 만들어진 자료구조다.
여러 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조다.
반정렬 상태를 유지한다. 큰 값이 상위 레벨에 있고 작은 값이 하위에 있다 정도로만 정렬된다
간단하게 부모 노드의 값이 자식 노드의 값보다 항상 크거나 작은 이진 트리를 말한다.
⇒ 트리 구조로는 정렬되어있으나 배열에 저장된 형태는 정렬되어있지 않은것처럼 보임
구현
힙을 저장하는 표준적인 자료구조는 배열이다.
구현을 쉽게 하기 위해 배열의 첫 번째 인덱스 0은 사용하지 않는다.
특정 위치의 노드 번호는 새로운 노드가 추가되어도 변하지 않는다.
ex) 루트 노드의 오른쪽 노드의 인덱스는 항상 3이다.
힙에서의 부모 노드와 자식 노드의 관계는 다음과 같다.
왼쪽 자식의 인덱스 = 부모 인덱스 * 2
오른쪽 자식의 인덱스 = 부모 인덱스 * 2 + 1
부모의 인덱스 = 자식 인덱스 / 2
삽입
힙에 새로운 요소가 들어오면 일단 새로운 노드를 힙의 마지막 노드에 이어서 삽입한다.
새로운 노드를 부모 노드들과 교환해서 힙의 성질을 만족시킨다.
삭제
최대 힙에서 최댓값은 루트 노드이므로 루트 노드가 삭제된다.
최대 힙에서 삭제 연산은 최댓값을 가진 노드를 삭제하는 것이다.
삭제된 루트 노드에는 힙의 마지막 노드를 가져온다.
힙을 재구성한다.

Quere vs 우선순위 Queue

Queue 자료구조는 시간 순서상 가장 먼저 집어 넣은 데이터가 먼저 나오는 선입선출 구조이나 우선순위 큐는 들어간 순서에 상관없이 우선순위가 가장 높은 데이터가 먼저 나옵니다
우선순위 큐는 push, pop 모두 O(logn)
Heap은 우선순위 큐의 구현과 일치, 완전이진트리 구조로 보통 Array로 구현, 새로운 node를 Heap의 마지막 위치에 추가해야하는데 ,이 때 array 기반으로 구현해야 이 과정이 수월해지기 때문
n번 째 node의 left child node = 2n
n번 째 node의 right child node = 2n + 1
n번 째 node의 parent node = n / 2

참고