Study note/Coding test

Heap & priority_queue

공대 아로마 2024. 4. 12. 17:20

기술면접을 위해 기초 CS에 대한 복습중이다.
공부한 내용 중 요점이나 나중에 기억해야할 부분을 정리해보려고 한다.
내가 아는 부분은 생략되어 있을 수 있고, 혹여나 틀린 부분이 있을 수도 있으니 이 글을 보고 '다른 사람'이 공부하기에는 도움이 되지 않을 수 있으니 주의!

Heap의 특징

  • 최대/최소 원소를 빠르게 찾을 수 있다.
  • Maxheap, Minheap이 있다. (큰 값이 맨 앞, 작은 값이 맨 앞)
  • 연산
    • 힙 구성 (Heapify): $O(NlogN)$ (N개를 insert하므로)
    • 삽입 (Insert): $O(logN)$ (바이너리 트리 형태이므로)
    • 삭제 (Remove): $O(logN)$ (바이너리 트리 형태이므로)
  • 완전 이진트리라서 배열로 접근 가능 (메모리 효율이 높다)
  • 응용
    • 정렬: heapsort
    • 우선 순위 큐: priority queue(★)

사용 방법

  • 기본적으로 Priority queue가 C++에서 제공되는 heap의 형태이다.
  • // queue를 include 해야한다. #include <queue> // 1) 어떤 타입의 데이터를 사용할 건지 // 2) 어떤 컨테이너를 사용할 건지 // 3) 어떤 연산을 이용할 건지 // 여기서 1)의 데이터 타입과 2)의 데이터 타입이 일치해야 한다. // 예를 들어 priority_queue<T, vector<T>, comp> q; priority_queue<int, vector<int>, greater<int>> q;
  • greater를 사용하면 작은 수부터 큰 수로 정렬되므로 Minheap형태가 된다. 즉, top은 가장 작은 값이다.
  • // 주로 사용하는 함수들 q.top(); q.pop(); q.push(); q.empty();
  • 3번째 인자 compare 구조체
  • struct comp { // a는 부모 노드, b는 현재 노드 bool operator()(vector<int> a, vector<int> b) { // 부모 노드가 크면 true를 return해서 swap한다. // 이를 반복하면 결국 가장 작은 값이 조상 노드가 되어 오름차순이 된다. /*return a.at(1) > b.at(1);*/ return a[1] > b[1]; } };

'Study note > Coding test' 카테고리의 다른 글

그리디 & 구현  (0) 2024.04.12
코딩 테스트에서 주의할 점  (1) 2024.04.12
정렬 알고리즘(Sort)  (0) 2024.04.12
Vector 문법 정리 (C++)  (0) 2024.04.12
코딩 테스트에서 자주 쓰이는 기본 문법들  (0) 2024.04.12