๐ Heap
-
๋ฐ์ดํฐ์์ ์ต๋, ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ณ ์ ๊ณ ์๋ ์์ ์ด์ง ํธ๋ฆฌ
- ๋ถ๋ชจ ๋
ธ๋ idx = ์์ ๋
ธ๋ idx // 2
- ์ผ์ชฝ ์์ ๋
ธ๋ idx = ๋ถ๋ชจ ๋
ธ๋ idx * 2
- ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ idx = ๋ถ๋ชจ ๋
ธ๋ idx * 2 + 1
- ๋ฐ๋ผ์ ๋ฐฐ์ด๋ก ๊ตฌํ ์ idx๋ฅผ 1๋ถํฐ ์์ํ๋ ๊ฒ์ด ํธํจ
-
์ฐ์ ์์ ํ์ ๊ฐ์ด ์ต๋, ์ต์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์์ผ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉ๋จ
-
heap์ max heap, min heap์ผ๋ก ๋๋จ
- max heap์ ์์ ๋
ธ๋๋ณด๋ค ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ด ํผ
- min heap์ ์์ ๋
ธ๋๋ณด๋ค ๋ถ๋ชจ ๋
ธ๋์ ๊ฐ์ด ์์
- ํ์ ๋
ธ๋ ๊ฐ์๋ ๋์๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ์ง ์์
-
heap์ ์ค๋ณต์ ํ์ฉํ๋ฉฐ ๋
ธ๋๊ฐ ์ผ์ชฝ๋ถํฐ ์ฑ์์ง
-
min heap์ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก, ์์ ์์๋๋ก ์ ๋ ฌ๋์ด ์์๊ฑฐ๋ผ ์๊ฐํ์ง ๋ง์์ผ ํจ!
- heap ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ ์ ์์
๐ VS ์ด์ง ํ์ ํธ๋ฆฌ
- ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ฒฝ์ฐ ์ผ์ชฝ ์์ ๋
ธ๋ < ๋ถ๋ชจ ๋
ธ๋ < ์ค๋ฅธ์ชฝ ์์ ๋
ธ๋ ์์ผ๋ก ์ด๋ฃจ์ด์ง
- heap์ ์ด๋์ชฝ์ ๋
ธ๋ ๊ฐ์ด ํฌ๋ ์๊ด์ด ์์
- heap์ ์ต๋ / ์ต์ ๊ฒ์, ์ด์ง ํ์ ํธ๋ฆฌ๋ ํ์์ ์ํ ๊ตฌ์กฐ์
๐ ๋ฐ์ดํฐ ์ฝ์
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋
ธ๋๋ ์ผ์ชฝ ์ตํ๋จ๋ถ ๋
ธ๋๋ถํฐ ์ฑ์์ง
- ๋ถ๋ชจ ๋
ธ๋ ๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๋ถ๋ชจ ๋
ธ๋์ ์์น๋ฅผ ๋ฐ๊พธ๋ฉฐ ์ด๋ฅผ ๋ฐ๋ณตํจ
๐ ๋ฐ์ดํฐ ์ญ์
- ์ต๋ ๋๋ ์ต์๋ฅผ ์์๋ด๋ ๊ฒ์ด ๋ชฉํ์ด๋ฏ๋ก max heap์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ญ์ ์ ๊ฐ์ฅ ํฐ ๋ถ๋ชจ ๋
ธ๋(๋ฃจํธ) ๊ฐ์ด ์ญ์ ๋จ
- ๊ทธ ํ ๊ฐ์ฅ ์ตํ๋จ๋ถ ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก ์ฎ๊น
- ๋ถ๋ชจ ๋
ธ๋๋ณด๋ค ํฐ ์์ ๋
ธ๋๊ฐ ์๋์ง ๋น๊ตํ๊ณ ์์น๋ฅผ ๋ฐ๊ฟ(swap)
๐ heap functions
- heapq ๋ชจ๋์ ๊ฒฝ์ฐ list๋ฅผ min heap์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ํจ
- heapq.heappush(heap, item) : item์ heap์ ์ถ๊ฐํจ
- heapq.heappop(heap) : heap์์ ๊ฐ์ฅ ์์ ์์๋ฅผ popํ๊ณ return
- heapq.heapify(x) : list x๋ฅผ heap์ผ๋ก ๋ณํํจ
- heap[idx] : ์ต์๊ฐ์ ์ญ์ ํ์ง ์๊ณ ๋จ์ํ ์ฝ์
๐ heapq๋ฅผ ์ด์ฉํ max heap ๊ตฌํ
- ๊ฐ ๊ฐ์ ๋ํ ์ฐ์ ์์๋ฅผ ๊ตฌํ ํ (์ฐ์ ์์, ๊ฐ) ๊ตฌ์กฐ์ tuple์ heap์ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํจ
- heap์ ์์ ์ถ๊ฐ ์ y = -x ๋ณํ์ ํ๋ฉด ์ต์๊ฐ ์ ๋ ฌ์ด ์ต๋๊ฐ ์ ๋ ฌ๋ก ๋ฐ๋๋ค๋ ๊ฐ๋
์ ํ์ฉํด (-item, item)์ tuple ํ์์ผ๋ก ๋ฃ์ด์ค
- heap์์ ๊ฐ์ ์ฝ์ด์ฌ ๋๋ ๊ฐ tuple์์ idx 1์ ์๋ ๊ฐ์ ์ทจํจ
import heapq
numx = [4,1,7,3,8,5]
heap = []
for n in nums:
heapq.heapppush(heap, (-n, n))
while heap:
print(heapq.heappop(heap)[1])
8 7 5 4 3 1
๐ heap ์ง์ ๊ตฌํ
๐ ๊ด๋ จ ๋ฌธ์
โญ ๋ ๋งต๊ฒ
โญ ๋์คํฌ ์ปจํธ๋กค๋ฌ
โญ ์ด์ค์ฐ์ ์์ํ