최소 힙(Min Heap)과 최대 힙(Max Heap)이 있습니다.
다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 사용됩니다.
목차
1. 📌 힙이란?
2. 📌 힙의 구조, 동작 원리
3. 📌 파이썬 heapq 라이브러리
4. 📌 힙 자료구조의 활용
힙의 구조를 배열로 표현
힙의 삽입
힙의 제거
파이썬의 heapq 라이브러리는 최소 힙으로 구현되어 있습니다.
import heapq
heap = [1,5,4,3,2]
heapq.heapify(heap) # 리스트 -> 힙
print(heap)
>> [1, 2, 4, 3, 5]
import heapq
heap = [1,5,4,3,2]
heapq.heapify(heap)
heapq.heappush(heap, 6) # 노드 추가
print(heap)
>> [1, 2, 4, 3, 5, 6]
import heapq
heap = [1,5,4,3,2]
heapq.heapify(heap)
heapq.heappush(heap, 6) # 노드 추가
print(heapq.heappop(heap))
print(list)
>> 1
>> [2, 3, 4, 6, 5]
1번째 방법: 우선 순위가 포함된 튜플 이용하기
import heapq
nums = [1,5,4,2,6,8]
heap = []
for num in nums:
heapq.heappush(heap, (-num, num))
while heap:
print(heapq.heappop(heap)[1])
2번째 방법: 입력과 출력을 할 때 부호를 바꿔주기
import heapq
nums = [1,5,4,2,6,8]
heap = []
for num in nums:
heapq.heappush(heap, -num)
while heap:
print(-heapq.heappop(heap))
import heapq
def heapsort(iterable, reverse = False): # 시간 복잡도 O(NlogN)
if reverse: # reverse가 false이면 오름차순, true이면 내림차순 정렬
sign = -1
else:
sign = 1
heap = []
result = []
for value in iterable:
heapq.heappush(heap, sign * value)
for i in range(len(heap)):
result.append(sign * heapq.heappop(heap))
return result
리스트와 힙의 차이점
- 우선순위가 가장 높은 것을 삭제하고 싶을 때 리스트에서는 모든 원소를 확인해야 하므로 O(N)의 시간이 소요
- 힙에서는 삽입할 때 O(logN)이 소요되지만 우선순위가 가장 높은 것을 찾아야 하거나 삭제할 때 O(logN)이 소요되어 리스트보다 효율적이다.