
특징
: 일단 마지막에 집어넣은 후 바꾸자


힙에서는 루트 노드의 원소만을 삭제할 수 있다
루트 노드의 원소를 삭제하여 반환한다

연산 횟수 : logN
=> 힙은 삭제,삽입 모두 logN을 보장한다 (완전 이진 트리니까)
대표적으로 우선순위 큐의 구현과 정렬에서 힙을 활용한다.
우선순위 큐를 구현하는 가장 효율적인 방법이 힙을 사용하는 것.
힙 정렬 : O(nlogn) 보장
heapq.heapify() 는 리스트를 “힙(heap) 자료구조”로 바꿔주는 함수이다. 파이썬 heapq 는 기본적으로 최소 힙(min heap) 구조를 사용한다.
import heapq
lst = [5, 3, 8, 1, 2]
heapq.heapify(lst)
print(lst)
예시 결과 : [1, 2, 8, 3, 5]
정확히 이 순서는 아닐 수 있지만, lst[0] == 최소값 임을 보장한다.
최대 힙을 만들고 싶으면 음수로 바꿔서 집어넣어준 후, 꺼낼 때 다시 음수를 곱해준다
heapq.heapify(lst)
import heapq
heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 1)
heapq.heappush(heap, 3)
print(heap)
heapq.heappop(heap)
heap = []
heapq.heappush(heap, -5)
heapq.heappush(heap, -1)
heapq.heappush(heap, -3)
print(-heapq.heappop(heap))
값을 넣은 순서가 아닌 우선순위가 높은 것부터 먼저 꺼내는 큐 이다.
파이썬에서는 보통 heapq(힙)으로 구현한다.
import heapq
pq = []
heapq.heappush(pq, 3)
heapq.heappush(pq, 1)
heapq.heappush(pq, 5)
print(heapq.heappop(pq))
heap = []
heapq.heappush(heap, (cost, node))
heapq.heappush(heap, (3, "A"))
heapq.heappush(heap, (1, "B"))
heapq.heappush(heap, (2, "C"))
print(heapq.heappop(heap)) // (1,'B')