python - 힙 큐 (heapq)

category python 2020. 12. 22. 23:38
728x90
반응형

정의

힙은 모든 부모 노드가 자식보다 작거나 같은 값을 갖는 이진 트리입니다.

이 구현에서는 모든 k에 대해 heap[k] <= heap[2*k+1]과 heap[k] <= heap[2*k+2]인 배열을 사용합니다,

요소는 0부터 셉니다. 비교를 위해, 존재하지 않는 요소는 무한으로 간주합니다. 힙의 흥미로운 특성은 가장 작은 요소가 항상 루트인 heap[0]이라는 것입니다.

시각화

아래와 같이 a[k] <= a[2*k+1]와 a[k] <= a[2*k+2]가 유지되는 배열

                               0

              1                                 2

      3               4                5               6

  7       8       9       10      11      12      13      14

15 16   17 18   19 20   21 22   23 24   25 26   27 28   29 30

heapify 

리스트 x를 선형 시간으로 제자리에서 힙으로 변환합니다.

import heapq

numbers = [8, 2, 1, 3, 5, 4, 7, 6]
heapq.heapify(numbers)

while numbers:
    print(heapq.heappop(numbers))

1
2
3
4
5
6
7
8

heappush

힙 불변성을 유지하면서, item 값을 heap으로 푸시합니다.

import heapq

h = []
heapq.heappush(h, 8)
heapq.heappush(h, 2)
heapq.heappush(h, 1)
heapq.heappush(h, 3)
heapq.heappush(h, 5)
heapq.heappush(h, 4)
heapq.heappush(h, 7)
heapq.heappush(h, 6)

while h:
    print(heapq.heappop(h))

heappush

힙 불변성을 유지하면서, heap에서 가장 작은 항목을 팝하고 반환합니다

import heapq

h = []
heapq.heappush(h, (8, '딸기'))
heapq.heappush(h, (2, '수박'))
heapq.heappush(h, (1, '참외'))
heapq.heappush(h, (3, '바나나'))
heapq.heappush(h, (5, '쥬스'))
heapq.heappush(h, (4, '키위'))
heapq.heappush(h, (7, '망고'))
heapq.heappush(h, (6, '포도'))

while h:
    print(heapq.heappop(h))

(1, '참외')
(2, '수박')
(3, '바나나')
(4, '키위')
(5, '쥬스')
(6, '포도')
(7, '망고')
(8, '딸기')

최대 힙 (Max Heap)

-1을 곱해서 리스트로 만든다음 heapq로 만들어주고 꺼낼때는 반대로 -1를 곱해서 양수로 만들어주면 최대 힙이 구현이 된다.

import heapq

# -1을 곱해서 리스트로 만든다음 heapq로 만들어준다.
numbers = [8, 2, 1, 3, 5, 4, 7, 6]
h = [num * - 1 for num in numbers]
heapq.heapify(h)

while h:
    # 꺼낼때는 반대로 -1를 곱해서 양수로 만들어준다.
    print(heapq.heappop(h) * -1)
728x90
반응형

'python' 카테고리의 다른 글

python __str__ vs __repr__ 차이점  (0) 2023.08.05
python - 데코레이터 (Decorator)  (0) 2021.11.08
python - functools  (0) 2020.12.18
python - startswith, endswith  (0) 2020.12.18
python - Counter  (0) 2020.12.17