| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- CSS
- 보안솔루션
- SQLD
- ReactNative
- 이벤트처리
- 챌린지
- 프로그래밍패러다임
- BFS
- Graph
- database
- 파일시스템
- flexbox
- 가상메모리
- folium
- parser
- defaultdict
- 부스트캠프
- pandas
- 함수형프로그래밍
- javascript
- PYTHON
- 단위테스트
- 코딩테스트
- sql
- OOP
- DFS
- 베이직
- db
- display
- reactnavigation
- Today
- Total
DevLog
[Python] heapq에 대해서 :: 힙 큐 알고리즘, 우선순위 큐 알고리즘 본문
먼저 큐(queue)란?
FIFO 구조로 이루어진 자료구조. 가장 먼저 들어온 값이 가장 먼저 나간다.
리스트로도 구현할 수 있지만 실행 시간 단축을 고려하여
일반적으로 `collections` 라이브러리에서 양방향 큐 `deque`를 불러와서 구현한다.
우선순위 큐란?
말 그대로 큐에서 데이터를 pop할 때 FIFO 순서가 아닌 우선순위를 기준으로 빼내는 자료구조.
즉, 제일 앞의 값이 우선순위가 높으면 빼내고 낮으면 다시 맨 뒤로 보낸다.
힙(heap)이란?
힙이라고 하면 가장 먼저 떠오르는 건 힙 트리 자료구조.
최소 힙/최대 힙 기반 이진트리로, 값을 삽입하거나 삭제할 때 순서대로 정렬하여 저장한다.
즉, 부모 노드의 값이 항상 자식노드보다 작으면서 루트 노드의 값이 가장 작은 최솟값으로 유지되는 구조!
(최소 힙 기준)
그렇다면 힙 큐(heapq)란?
힙 트리를 기반으로 한 우선순위 큐!
값을 삽입할 때 정렬이 되며, `heap[0]`값이 최솟값으로 설정되어 pop 연산을 할 경우 항상 최솟값이 반환된다.
매순간 데이터 정렬을 필요로 하는 문제에 사용하면 실행 시간을 단축시킬 수 있는 자료구조.
from heapq import heappush, heappop, heappushpop, heapify
heap = []
heappush(heap, item)
# heap에 item 값을 정렬하여 삽입
heappop(heap)
# heap[0]을 삭제하고 반환
# 힙이 비어 있으면 IndexError가 발생하기 때문에 처리 필요
heappushpop(heap, item)
# 힙에 item을 삽입한 다음, heap[0]을 삭제하고 반환
# heappush()한 다음 heappop()을 별도로 호출하는 것보다 더 효율적임!
heapify(x)
# 리스트 x를 제자리에서 힙으로 변환 (힙 규칙에 맞게 정렬)
* heapq는 기본적으로 최소 힙을 지원하기 때문에 최대 힙을 구현하고 싶다면 숫자 데이터의 부호를 `-`로 바꿔서 최소 힙으로 `heappush`한 후, 나중에 최솟값부터 `heappop`을 해줄 때 다시 부호를 `+`로 바꿔서 꺼내주면 최대 힙의 결과와 동일한 값을 얻을 수 있다.
heapq — Heap queue algorithm
Source code: Lib/heapq.py This module provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a va...
docs.python.org
'프로그래밍 언어 > Python' 카테고리의 다른 글
| [Python] defaultdict() - 딕셔너리에 디폴트 value 초깃값 설정하기 (0) | 2024.08.05 |
|---|---|
| [Python] 그래프 탐색 알고리즘 - DFS 깊이우선탐색 & BFS 너비우선탐색 (1) | 2024.01.10 |
| [Python] any()와 all(), OR과 AND (1) | 2023.10.16 |
| [Python] index() vs. find() (0) | 2023.10.06 |
| [Python] iterator(반복자)란? - itertools를 이용한 효율적인 데이터 순회 방법 (0) | 2023.09.18 |