힙은 우선순위 큐를 위해 만들어진 자료구조다.
우선순위 큐란?
힙이란?
A) 들어올 새 노드를 우선순위가 가장 낮다는 가정을 하고 맨 끝 위치에 저장
B) 부모 노드와 우선 순위를 비교해서 위치가 바뀌어야 하면 바꾼다.
C) 올바르게 위치할 때까지 B 반복
A) 루트 노드를 반환(삭제)하고 마지막 노드(n)를 루트 노드 자리에 옮긴다.
B) n의 왼쪽, 오른쪽 자식노드 중 더 우선순위가 높은 것과 비료를 진행한다.
C) 최소 힙의 구조를 유지할 때까지 B 반복
위의 과정과 같이 힙의 구조를 유지하는 과정을 heapify
라고 한다.
from queue import PriorityQueue
q = PriorityQueue()
q1 = PriorityQueue(maxsize=10) # maxsize를 활용하면 크기 제한 가능
put
q.put(3) # 원소를 넣는 과정
q.put(4)
q.put(1)
q1.put((1, 'apple')) # (우선순위, 값)의 형태로 저장할 수도 있음
get
# 원소 삭제 및 반환
q.get() # 1
q1.get()[1] # (우선순위, 값)의 형태에서 값 반환
heap[k] <= heap[2*k+1]
또는 heap[k] <= heap[2*k+2]
만족heap[0]
에 위치[]
를 사용하거나, heapify
를 통해 값이 들어있는 리스트를 힙으로 변환 가능import heapq
hq = []
push
heapq.heappush(hq, 4)
heapq.heappush(hq, 1)
heapq.heappush(hq, 3)
heapq.heappush(hq, 7)
pop
heap[0]
활용heapq.heappop(hq) # 1
heapify
x
를 선형 시간으로 제자리에서 heap으로 변환x = [4, 3, 1, 2, 5, 6]
print(x) # [4, 3, 1, 2, 5, 6]
heapq.heapify(x)
print(x) # [1, 2, 4, 3, 5, 6]
https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html
https://chanhuiseok.github.io/posts/ds-4/
https://velog.io/@mein-figur/Python%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-heapq