Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- golang
- HTTP
- 개발실무
- 개발공부
- 실무PT
- 컴공과개념정리
- 유데미
- 개발자공통지식
- 리액트
- 개발 공식문서 읽기
- 개발자되기
- 웹서버
- tableplus
- jsx
- 데이터스키마
- 개발 공식문서
- 스키마모델
- 자바
- postgredb
- 파이썬
- 개발 영어실력
- 자료구조
- 코멘토실무PT
- 코딩강의
- Go언어실무
- 개발공식문서 어려움
- 데이터베이스
- 알고리즘
- Go언어
- 코멘토
Archives
- Today
- Total
웹개발일지
[자료구조/알고리즘] 우선순위 큐 Priority Queue (Heap) - 파이썬 본문
728x90
우선순위 큐는 내부적으로 이진트리형태의 힙이라는 자료구조로 동작한다.
우선순위 큐는 최상단 트리에 있는 요소에 가장 큰 수가 오면 max-heap, 가장 작은 수가 오면 min-heap 이라고 한다. C++에서는 max-heap을 지원하고 파이썬에서는 min-heap을 지원한다. max-heap인 경우 pop()을 했을 때 모든 노드들 중에서 가장 큰 값을 뽑아낸다고장담할 수 있다. min-heap의 경우 반대로 항상 작은 값이 나오게 된다. 이 땐 heappop()을 한다.
import heapq
pq = []
heapq.heappush(pq, 456) # 노드의 맨 뒤에 값을 추가한다
heapq.heappush(pq, 123)
heapq.heappush(pq, 789)
print("size:", len(pq))
while len(pq) > 0:
print(heapq.heappop(pq)) # 최상단 노드의 값을 하나 뺀다
heapq 모듈 사용하기
파이썬에서 우선순위 큐 사용을 위해선 heapq 모듈을 사용한다. 파이썬에서는 min-heap을 지원하기 때문에 가장 작은 값인 123부터 출력되게 된다.
heappush(), heappop()
큐가 알아서 순서배치를 해준다. 테스트해보니 꼭 순서대로 배치해두진 않는다. [-5, 0, 6, 12, 8] but 0번째 인덱스에는 항상 최상단 루트 노드가 온다. 최상단 노드가 중요하다. 그 외의 순서는 그닥 고려하지 않아도 된다.
from queue import PriorityQueue
pq = PriorityQueue()
pq.put(6)
pq.put(10)
pq.put(-5)
pq.put(0)
pq.put(8)
while not pq.empty():
print(pq.get()) #pop
파이썬에 우선순위 큐 모델이 존재하지만 속도가 느려 알고리즘에선 쓰지 않는다.
시간복잡도
위와 같은 이진트리 형태는 시간복잡도를 log2를 갖는 경우가 많다. 우선순위 큐의 삽입/삭제시 시간복잡도는 O(logN)이다. O(N)보다는 빠르고 O(1)보다는 느린 값이다. logN도 효율이 우수한 시간복잡도에 속한다.
'자료구조와 알고리즘' 카테고리의 다른 글
Arraylist vs Linkedlist (0) | 2023.01.18 |
---|---|
[백준2420] 여러 값 정수로 입력받기 & 절댓값함수의 사용 - Python (0) | 2023.01.16 |
[자료구조/알고리즘] 맵과 집합 map, set - 파이썬 (0) | 2023.01.12 |
[백준 4101] 입출력과 제어문 사용 문제 - 파이썬 (0) | 2023.01.11 |
[자료구조/알고리즘] 파이썬 리스트와 덱을 활용한 스택과 큐 구현 (0) | 2023.01.11 |