일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- CICD
- 딕셔너리
- 이것이취업을위한코딩테스트다
- 라이징캠프
- 동등성
- object
- Payload
- 나동빈
- 너디너리
- Signature
- HashCode
- 동일성
- 우테코
- 왕실의나이트
- CMC
- forloop
- ssh-action
- 해커톤
- JWT
- 이코테
- nestJS
- Hackathon
- 컴공선배
- 동빈북
- github action
- 우아한테크코스
- remove
- equlas
- loop
- makeus
Archives
- Today
- Total
iamjooon2님의 블로그
[자료구조] 우선순위 큐(Priority Que, Heap) 본문
우선순위 큐
큐는 먼저 들어오는 데이터가 먼저 나가는 FIFO 형식의 자료구조이나,
우선순위 큐는 먼저 들어오는 데이터가 아닌, 우선순위가 높은 데이터가 먼저 나간다.
또한, 내부적으로 이진 트리(Binary Tree) 형태의 힙(Heap)이라는 형태로 돌아가게 된다
그림을 보면 우선순위 큐를 이진 트리가 있고, 가장 최상단의 root node가 모든 노드를 통틀어 가장 큰 값을 가지고 있다는 것을 알 수 있다.
이와 같이 루트 노드에 큰 값이 들어가있으면 max-heap으로, 루트 노드에 가장 작은 값이 들어가 있으면 min-heap이라 한다
각 트리의 노드에 번호를 붙이고, 이 번호를 배열의 인덱스로 생각하면 효과적으로 힙을 구현할 수 있다
삽입/삭제를 한 번 할때 시간 복잡도는 O(logN)을 가지게 된다 (정확히는 밑이 2인 logN이나, 간단하게 O(logN)으로 표기한다)
// C++
priority_queue<int> pq;
pq.push(456);
pq.push(123);
pq.push(789);
printf("size: %d\n", pq.size());
while (!pq.empty()){
printf("%d\n", pq.top());
pq.pop();
}
C++은 max-heap을 지원한다
# python
import heapq
pq = []
heapq.heappush(pq, 6)
heapq.heappush(pq, 12)
heapq.heappush(pq, 0)
heapq.heappush(pq, -5)
heapq.heappush(pq, 8)
print(pq)
while pq:
print(pq[0]) # 최상단 노드를 출력한다
heapq.heappop(pq) # 최상단 노드를 뺀다
파이썬은 min-heap을 지원하여, 가장 작은 값이 맨 앞에 오게 된다
'공부기록 > 알고리즘' 카테고리의 다른 글
[자료구조] 스택(Stack), 큐(Queue) (0) | 2022.07.02 |
---|---|
[자료구조] 배열(Array), 연결리스트(Linked List) (0) | 2022.07.01 |