힙
특정한 규칙을 가지는 완전 이진 트리로 최댓값과 최솟값을 찿는 연산을 빠르게 하기 위한 자료구조이다.
A가 B의 부모노드이면 A의 키값과 B의 키값 사이에는 대소 관계가 성립
최소 힙 : 부모 노드의 키값이 자식 노드의 키 값보다 항상 작은 힙
최대 힙 : 부모 노드의 키값이 자식 노드의 키 값보다 항상 큰 힙
파이썬에서는 heapq를 제공한다.
모든 부모 노드는 그의 자식 노드보다 값이 작거나 큰 이진트리 구조인데, 내부적으로는 인덱스 0에서 시작해 k번째 원소가 항상 자식 원소들(2k+1, 2k+2)보다 작거나 같은 최소 힙의 형태로 정렬된다.
import heapq
heapq.heappush(heap,item) # item을 heap에 추가
heapq.heappop(heap) # heap에서 가장 작은 원소를 pop & 리턴, 비어 있는 경우 IndexError가 호출
heapq.heapify(x) # 리스트 x를 heap으로 변환 O(N)
heapq[0] # 최소값 삭제하지 않고 얻기
* 최대 힙
파이썬의 heapq 모듈은 최소 힙으로 구현되어 있기 때문에 최대 힙 구현을 위해서는 약간의 변화가 필요하다.
y = -x 변환을 하면 최솟값 정렬이 최댓값 정렬로 바뀐다.
import heapq
heap_items = [1,3,5,7,9]
num = [1,3,5,7,9]
heap = []
for i in num:
heapq.heappush(heap,(-i,i))
print(heap)
# [(-9, 9), (-7, 7), (-3, 3), (-1, 1), (-5, 5)]
while heap:
print(heapq.heappop(heap)[1])
9
7
5
3
1
'Languages > Python' 카테고리의 다른 글
[Python] 트리 (0) | 2022.01.16 |
---|---|
[python] 투 포인터(Two Pointers) 알고리즘 (2) | 2022.01.14 |
정규표현식 re/compile/파이썬 (0) | 2021.08.04 |
파이썬 스택, 큐 (0) | 2021.07.22 |
Hash(해시) (0) | 2021.07.17 |