ํ์ ์์ ์ด์งํธ๋ฆฌ์ ์ผ์ข
์ผ๋ก, ์ต๋๊ฐ ๋๋ ์ต์๊ฐ ์ ๋น ๋ฅด๊ฒ ์ฐพ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํค ๊ฐ์ ๋์๊ด๊ณ๋ ๋ถ๋ชจ/์์ ๊ฐ์๋ง ์ฑ๋ฆฝํ๊ณ , ํ์ ๊ฐ์๋ ์ฑ๋ฆฝํ์ง ์๋๋ค.
cf. ์ฐ์ ์์ ํ
์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๋ฝ๋ ์ฐ์ ์์ ํ ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ,๋ฐฐ์ด/ ์ฐ๊ฒฐ๋ฆฌ์คํธ/ ํ์ด ์์ง๋ง ๋ณดํต์ ํ์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๊ฒ ๋๋ค.
์ต์ ํ (min heap)
ํ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด๋ก ๊ตฌํ๋ผ์๋ค. ๋ฐ๋ผ์ ํ์ด์ฌ์ heapq ๋ชจ๋์ ๋ฉ์๋๋ค๋ ๋ฆฌ์คํธ๋ฅผ ๋์์ผ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
heapq ๋ ๋ํดํธ๋ก ์ต์ ํ์ ๋ค๋ฃฌ๋ค. ๋ฐ๋ผ์ ๋ณ ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํด์ค ํ์์์ด heapq ๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค.
โข
heapq.heappush(heap, item) : item์ heap์ ์ถ๊ฐ
โข
heapq.heappop(heap) : heap์์ ๊ฐ์ฅ ์์ ์์๋ฅผ pop & ๋ฆฌํด. ๋น์ด ์๋ ๊ฒฝ์ฐ IndexError๊ฐ ํธ์ถ๋จ.
โข
heapq.heapify(x) : ๋ฆฌ์คํธ x๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก heap์ผ๋ก ๋ณํํจ (in linear time,ย O(N)ย )
import heapq
# 1. ๋น ๋ฆฌ์คํธ์ ์ต์ํ์ผ๋ก item ์ถ๊ฐ
heap = []
heapq.heappush(heap, 50)
heapq.heappush(heap, 10)
heapq.heappush(heap, 20)
print(heap) # [10, 50, 20]
# 2. ๊ธฐ์กด๋ฆฌ์คํธ๋ฅผ ์ต์ํ์ผ๋ก ๋ง๋ค๊ธฐ
heap2 = [50 ,10, 20]
heapq.heapify(heap2)
print(heap2) # [10, 50, 20]
# 3. ๊ฐ์ฅ ์์ ์์(0๋ฒ์ธ๋ฑ์ค) ์ ๊ฑฐ
result = heapq.heappop(heap)
print(result) # 10
print(heap) # [20, 50]
# 4. ๊ทธ๋ฅ ์์ ์์๋ง ๊ฐ์ ธ์ค๊ณ ์ถ๋ค๋ฉด 0๋ฒ์ธ๋ฑ์ค๋ก ๊ฐ์ ธ์ค๊ธฐ
result2 = heap[0]
Python
๋ณต์ฌ
์ต๋ ํ(max heap)
์ต๋ ํ์ ์ํ ๋ณ๋์ ๋ชจ๋์ ์๊ณ , ์ต์ ํ(heaap) ๋ฅผ ์ด์ฉํด์ ๋ง๋ ๋ค.
๊ฐ ์์๋ค์ ๋ํด ๋ชจ๋ ์์๋ฅผ ์ทจํด์ฃผ๊ณ ์ต์ ํ์ผ๋ก ๋ง๋ค๊ณ , ๊บผ๋ผ๋๋ง ๋ค์ ์์๋ฅผ ์ทจํด์ ์๋ ์๋ก ๋ณต์ํด์ฃผ๋ฉด ๊ทธ๊ฒ ์ต๋ ํ์ด๋ค.
์ด ๋ ์์๋ฅผ ์ทจํด์ฃผ๊ณ ๋ณต์ํด์ฃผ๋๊ฒ ๊ท์ฐฎ์ผ๋ฏ๋ก (-item, item) ์์ ํํ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌํ๋ค.
heap_items = [1,3,5,7,9]
max_heap = []
for item in heap_items:
heapq.heappush(max_heap, (-item, item))
print(max_heap) # [(-9, 9), (-7, 7), (-3, 3), (-1, 1), (-5, 5)]
# ์ค์ ์์๋ ํํ์ 1๋ฒ ์ธ๋ฑ์ค ๊ฐ
Python
๋ณต์ฌ