자료구조&알고리즘

우선순위 큐(Priory Queue), 힙(Heap)

da77777 2022. 5. 29. 23:51
우선순위 큐

우선순위가 높은 데이터 순서대로 출력하는 자료구조

FIFO 구조인 큐와 달리, 우선순위 큐는 우선순위가 높은 순서대로 데이터가 출력됨

구현 방법 : 배열, 연결리스트, 힙

  • 배열 : 구현은 쉬우나, 데이터가 많은 경우에는 전체 비교를 거쳐 적절한 위치를 찾고, 삽입을 위해 해당 자리 이후의 데이터를 한 칸씩 뒤로 밀어내야 함. 선형구조로, 삽입 및 삭제 연산 시 시간복잡도 O(n)
  • 연결리스트 : 구현은 쉬우나, 데이터가 많은 경우에는 모든 노드에 접근하여 비교해야 함. 선형구조로, 삽입 및 삭제 연산 시 시간복잡도 O(n)
  • 힙 : 우선순위 큐를 위해 고안된 이진트리의 일종



우선순위 큐의 구현체

완전 이진 트리 형태로, 이진 탐색 트리와 달리 중복값 허용

부모 노드는 자식 노드보다 항상 우선순위가 높으며, 형제 노드 간의 우선순위는 고려하지 않는 반정렬 상태를 유지

* 반정렬상태 : 정렬되어 있지 않은 상태. 부모-자식 간의 우선순위는 있으나 형제 노드 간 우선순위는 없으므로

최소 힙(오름차순) : 노드 값이 작을수록 우선순위가 높음 → 루트 노드의 값이 가장 작음(부모 노드의 값 <= 자식 노드의 값)

최대 힙(내림차순) : 노드 값이 클수록 우선순위가 높음  루트 노드의 값이 가장 큼(부모 노드의 값 >= 자식 노드의 값)

 

힙 정렬

  • 최소 힙, 최대 힙을 이용한 정렬 알고리즘
  • 항상 루트 노드를 출력 → 전체 자료를 정렬하기 보다는 최댓값 혹은 최솟값을 찾아내고자 할 때 적절
  • 시간복잡도 : 부모 - 자식 간의 비교만 진행하면 되므로 O(log n)

 

힙의 표현

  • 주로 배열을 이용해 구현하며, 보통 편의상 index 0은 사용하지 않고 1부터 시작
  • 배열을 사용하는 이유 : 완전 이진 트리이므로 중간에 빈 노드가 없음 + index를 통한 값 조회가 편리함
  • 부모 노드의 index = 자식 노드의 index / 2
  • 좌측 자식 노드의 index = 부모 노드의 index * 2
  • 우측 자식 노드의 index = 부모 노드의 index * 2 + 1

 

힙의 삽입

  • 마지막 노드의 우측에 새로운 노드 삽입 후, 부모노드와 비교하며 우선순위에 맞는 적절한 자리를 찾아감

 

힙의 삭제

  • 우선순위가 가장 높은 노드(즉, 루트노드)부터 삭제
  • 마지막 노드를 루트 노드 위치로 이동
  • 루트 노드 자리로 이동한 마지막 노드의 값을 자식 노드와의 값과 비교하며 적절한 자리를 물색
  • 만일 부모노드가 좌측, 우측 자식을 모두 가진 경우에는 둘 중 우선순위가 더 높은 자식과 swap

 

 

 

 


참고

https://velog.io/@jun_/Algorithm-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90Priority-Queue%EC%99%80-%ED%9E%99Heap

 

'자료구조&알고리즘' 카테고리의 다른 글

완전탐색(Brute-Force Search)  (0) 2022.06.04
해시(Hash)  (0) 2022.05.29
트리(Tree) - 이진 탐색 트리(Binary Search Tree)  (0) 2022.05.29
정렬(Sorting)  (0) 2022.05.29