[Python] 파이썬 기본 모듈 - heapq
파이썬의 heapq
모듈은 최소 힙 자료구조를 구현하기 위한 기능들을 제공한다.
여기서 힙은 모든 노드가 자식 노드보다 작거나 같은 이진 트리다. 이를 0부터 시작하는 배열로 보면, heap[k] <= heap[2*k + 1]
이며, heap[k] <= heap[2*k +2]
이다. 또한 트리의 루트인 heap[0]
이 배열에서 가장 작은 값이 된다.
모듈 사용하기
내장 모듈이기 때문에 별도의 설치 없이 import 후 사용하면 된다.
import heapq
힙 생성하기
heapq
모듈은 파이썬의 리스트를 최소 힙처럼 다룰 수 있게 해줄 뿐이다. 따로 최소 힙을 구현한 클래스가 있는건 아니다.
빈 리스트도, 채워진 리스트도 힙처럼 쓸 수 있다. 비어있는 힙을 만들고 싶으면, 그냥 빈 리스트를 준비하면 된다.
이미 채워진 리스트에 heapify()
함수를 쓰면 힙 정렬된 리스트로 바뀐다.
# 빈 힙을 만들고 싶으면 그냥 빈 리스트를 준비!
heap = []
# 채워진 리스트를 힙으로 사용하고 싶다면
heap_2 = [4, 2, 5, 1]
heapq.heapify(heap_2)
print(heap_2) # 출력 : [1, 2, 5, 4]
값 추가
heappush()
함수로 값을 추가할 수 있다. 첫 번째 인자에 리스트를, 두 번째 인자에 추가할 값을 넘긴다.
heapq.heappush(heap, 4)
heapq.heappush(heap, 2)
heapq.heappush(heap, 5)
heapq.heappush(heap, 1)
print(heap) # 출력 : [1, 2, 5, 4]
최소 값 제거
heappop()
함수는 힙에서 최소값을 제거하고 반환한다. (제거하고 남은 값들로 다시 힙 트리를 만든다.)
최소값을 제거하지 않고 보고만 싶은거면, heap[0]
을 쓰면 된다. 그냥 리스트니까!
print(heapq.heappop(heap)) # 출력 : 1
print(heap) # 출력 : [2, 4, 5]
그 외의 함수들
그 외에 값을 push하고 pop하는 heappushpop()
, pop하고 값을 push하는 heapreplace()
라던가,(push와 pop의 순서가 다르다)
리스트에서 n번째 큰/작은 값을 반환하는 nlargest()
, nsmallest()
등이 있다. 자세한 정보는 참조의 문서 등을 확인하자.
참조
- https://docs.python.org/3.6/library/heapq.html
댓글 남기기