Heap / Priority Queue

์„ฑ์œคยท2026๋…„ 9์›” 8์ผ

[๐Ÿ—ƒ๏ธData Structure]

๋ชฉ๋ก ๋ณด๊ธฐ
4/6
post-thumbnail

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ Heap์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ํ•œ ๋ฒˆ ์ฐพ๋Š” ๊ฒƒ์ด๋ผ๋ฉด min()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,

๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ๋˜๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊บผ๋‚ด์•ผ ํ•œ๋‹ค.

์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ๋งค๋ฒˆ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Heap์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

Python์—์„œ๋Š” heapq ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด Heap์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1. Heap์ด๋ž€?

Heap์€ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ํฌ๊ฒŒ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Min Heap
โ†’ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด Root์— ์œ„์น˜

Max Heap
โ†’ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด Root์— ์œ„์น˜

์ตœ์†Œ ํž™์—์„œ๋Š”

๋ถ€๋ชจ โ‰ค ์ž์‹

์ตœ๋Œ€ ํž™์—์„œ๋Š”

๋ถ€๋ชจ โ‰ฅ ์ž์‹

๊ด€๊ณ„๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ตœ์†Œ ํž™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        1
      /   \
     3     2
    / \   /
   7   5  4

๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ธ 1์ด Root์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Heap์€ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ตœ์†Œ ํž™์ด๋ผ๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ž์‹๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋Š” ์กฐ๊ฑด์„ ์œ ์ง€ํ•˜๋ฉด์„œ Root๊ฐ€ ํ•ญ์ƒ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๋Š” ์ ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.


์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์™€ List

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ ˆ๋ฒจ์ด ์ฑ„์›Œ์ ธ ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฑ„์›Œ์ง€๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— ๋ณ„๋„์˜ Node ๊ฐ์ฒด ์—†์ด List๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

        1
      /   \
     3     2
    / \   /
   7   5  4
heap = [1, 3, 2, 7, 5, 4]

์ธ๋ฑ์Šค๋ฅผ ํ•จ๊ป˜ ๋ณด๋ฉด

๊ฐ’        1   3   2   7   5   4
index     0   1   2   3   4   5

ํŠน์ • ์œ„์น˜ i๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ€๋ชจ์™€ ์ž์‹ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ชจ
โ†’ (i - 1) // 2

์™ผ์ชฝ ์ž์‹
โ†’ 2 * i + 1

์˜ค๋ฅธ์ชฝ ์ž์‹
โ†’ 2 * i + 2

์˜ˆ๋ฅผ ๋“ค์–ด i = 1์ธ ๊ฐ’ 3์˜ ์ž์‹์€

์™ผ์ชฝ ์ž์‹
โ†’ 2 * 1 + 1
โ†’ index 3
โ†’ 7

์˜ค๋ฅธ์ชฝ ์ž์‹
โ†’ 2 * 1 + 2
โ†’ index 4
โ†’ 5

๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


Python์˜ heapq ์—ญ์‹œ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ List๋ฅผ Heap์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ด ๊ณต์‹์„ ์ง์ ‘ ๊ณ„์‚ฐํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๊ณ , heapq๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.


2. Heap์€ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์€ List๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค.

arr = [8, 3, 5, 1, 9, 2]

์ผ๋ฐ˜์ ์ธ List์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์œผ๋ฉด

min(arr)

์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

O(N)

์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๋ฐ˜๋ฉด ์ตœ์†Œ ํž™์—์„œ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ํ•ญ์ƒ Root์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Python์˜ Heap์€ List๋กœ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ

heap[0]

์œผ๋กœ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Ÿ๊ฐ’ ํ™•์ธ
โ†’ O(1)

๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•œ ๋’ค Heap ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์œ ์ง€ํ•˜๋Š” ๊ณผ์ •์€

O(log N)

์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ Heap์€

์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ํ•œ ๋ฒˆ ์ฐพ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๊ณ  ๊บผ๋‚ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ

์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


3. Python์˜ heapq

Python์—์„œ๋Š” heapq ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด Heap์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import heapq

heapq๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Min Heap์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


heappush()

Heap์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import heapq

heap = []

heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
heapq.heappush(heap, 7)
heapq.heappush(heap, 1)

print(heap)

Heap์˜ ์กฐ๊ฑด์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ’์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„
โ†’ O(log N)

heappop()

๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

print(heapq.heappop(heap))
1

๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด

print(heapq.heappop(heap))
2

์ฒ˜๋Ÿผ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„
โ†’ O(log N)

heap[0]

์ตœ์†Ÿ๊ฐ’์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ํ™•์ธ๋งŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

heap[0]

์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„
โ†’ O(1)

๋‹จ,

heap[1]
heap[2]

๊ฐ€ ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ๋กœ ์ž‘์€ ๊ฐ’์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ตœ์†Œ ํž™์—์„œ ํ™•์‹คํ•˜๊ฒŒ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€

heap[0]

์ด ์ตœ์†Ÿ๊ฐ’์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.


heapify()

์ด๋ฏธ ์กด์žฌํ•˜๋Š” List๋ฅผ Heap์œผ๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

import heapq

numbers = [5, 3, 8, 1, 2]

heapq.heapify(numbers)

print(numbers)

heapify()๋Š” ์ƒˆ๋กœ์šด List๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด List ์ž์ฒด๋ฅผ Heap์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

heapq.heappop(numbers)

์ดํ›„ ๋ฐ”๋กœ Heap์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„
โ†’ O(N)

์ฃผ์š” ๋ฉ”์„œ๋“œ ์ •๋ฆฌ

๊ธฐ๋ŠฅPython์‹œ๊ฐ„๋ณต์žก๋„
๋ฐ์ดํ„ฐ ์ถ”๊ฐ€heappush()O(log N)
์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ / ๋ฐ˜ํ™˜heappop()O(log N)
์ตœ์†Ÿ๊ฐ’ ํ™•์ธheap[0]O(1)
List โ†’ Heapheapify()O(N)

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ์šฐ์„  ์ด ๋„ค ๊ฐ€์ง€๋ฅผ ๊ธฐ์–ตํ•ด๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค.


4. Max Heap

Python์˜ heapq๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Min Heap์ž…๋‹ˆ๋‹ค.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ Max Heap์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ฃผ๋กœ ๊ฐ’์— -๋ฅผ ๋ถ™์ด๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

5
2
8
1

์„

-5
-2
-8
-1

๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Min Heap ์ž…์žฅ์—์„œ๋Š” -8์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊บผ๋‚ธ ๋’ค ๋‹ค์‹œ -๋ฅผ ๋ถ™์ด๋ฉด

-(-8)
โ†’ 8

์›๋ž˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import heapq

heap = []

heapq.heappush(heap, -5)
heapq.heappush(heap, -2)
heapq.heappush(heap, -8)
heapq.heappush(heap, -1)

max_value = -heapq.heappop(heap)

print(max_value)
8

๋”ฐ๋ผ์„œ Max Heap์€ ๋‹ค์Œ ํ˜•ํƒœ๋กœ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๋„ฃ์„ ๋•Œ
heapq.heappush(heap, -value)

# ๊บผ๋‚ผ ๋•Œ
value = -heapq.heappop(heap)

5. Priority Queue

Heap๊ณผ ํ•จ๊ป˜ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์ด Priority Queue(์šฐ์„ ์ˆœ์œ„ ํ)์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ Queue๋Š” FIFO ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

First In First Out

๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ
โ†’ ๋จผ์ € ๋‚˜๊ฐ

์˜ˆ๋ฅผ ๋“ค์–ด

A โ†’ B โ†’ C

์ˆœ์„œ๋กœ ๋“ค์–ด์˜ค๋ฉด

A โ†’ B โ†’ C

์ˆœ์„œ๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.


๋ฐ˜๋ฉด Priority Queue๋Š” ๋“ค์–ด์˜จ ์ˆœ์„œ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

์ž‘์—…        ์šฐ์„ ์ˆœ์œ„

A              3
B              1
C              2

์ด๊ณ  ์ˆซ์ž๊ฐ€ ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๋ฉด

B โ†’ C โ†’ A

์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.


Heap๊ณผ Priority Queue์˜ ๊ด€๊ณ„

Heap๊ณผ Priority Queue๋Š” ๊ฐ™์€ ๊ฐœ๋…์€ ์•„๋‹™๋‹ˆ๋‹ค.

Priority Queue
โ†’ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๊บผ๋‚ด๋Š” ๋ฐฉ์‹

Heap
โ†’ Priority Queue๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

Heap์„ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋ฅผ

O(log N)

์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Priority Queue ๊ตฌํ˜„์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


Tuple์„ ์ด์šฉํ•œ ์šฐ์„ ์ˆœ์œ„ ๊ด€๋ฆฌ

Python์˜ Heap์—๋Š” Tuple๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import heapq

heap = []

heapq.heappush(heap, (2, "Task B"))
heapq.heappush(heap, (1, "Task A"))
heapq.heappush(heap, (3, "Task C"))

Tuple์€ ์•ž์˜ ๊ฐ’๋ถ€ํ„ฐ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—

heapq.heappop(heap)

๊ฒฐ๊ณผ๋Š”

(1, 'Task A')

๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๋”ฐ๋ผ์„œ

(priority, data)

ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๋ฉด Priority Queue์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

heapq.heappush(heap, (priority, value))

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋„ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

heapq.heappush(heap, (distance, node))

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์šฐ์„ ์ˆœ์œ„๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ Node๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


6. Queue์™€ Priority Queue ๋น„๊ต

์ž๋ฃŒ๊ตฌ์กฐ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๊ธฐ์ค€
Queue๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ
Priority Queue์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ

์ฆ‰ ๋ฌธ์ œ์—์„œ

๋จผ์ € ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ผ๋ฉด Queue๋ฅผ,

๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด๋‚˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฐ’๋ถ€ํ„ฐ ๊ณ„์† ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋ผ๋ฉด Priority Queue์™€ Heap์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


7. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

Heap์€ ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ตœ์†Ÿ๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ๊บผ๋‚ผ ๋•Œ

ํ˜„์žฌ ๋ฐ์ดํ„ฐ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
๋‹ค์‹œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
heapq.heappush(heap, value)

min_value = heapq.heappop(heap)

์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ๊บผ๋‚ผ ๋•Œ

heapq.heappush(heap, -value)

max_value = -heapq.heappop(heap)

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž‘์—…๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•  ๋•Œ

heapq.heappush(heap, (priority, task))

์ƒ์œ„ K๊ฐœ์˜ ๊ฐ’์„ ๊ด€๋ฆฌํ•  ๋•Œ

์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ์ •๋ ฌํ•˜๋Š” ๋Œ€์‹  ์ผ์ • ํฌ๊ธฐ์˜ Heap๋งŒ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€์žฅ ํฐ 3๊ฐœ์˜ ๊ฐ’๋งŒ ์œ ์ง€ํ•œ๋‹ค๋ฉด

if len(heap) < 3:
    heapq.heappush(heap, value)
else:
    ...

์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š”

heapq.heappush(heap, (distance, node))

ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ๊นŒ์ง€ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ Node๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋“ค์„ ๋ฐ˜๋ณตํ•ด์„œ ํ•ฉ์น  ๋•Œ

๋ฌธ์ œ์—์„œ

๊ฐ€์žฅ ์ž‘์€ ๋‘ ๊ฐ’์„ ๊บผ๋‚ธ๋‹ค.
๋‘ ๊ฐ’์„ ํ•ฉ์นœ๋‹ค.
ํ•ฉ์นœ ๊ฐ’์„ ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค.

๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด Heap์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a = heapq.heappop(heap)
b = heapq.heappop(heap)

heapq.heappush(heap, a + b)

8. ํ•œ๋ˆˆ์— ์ •๋ฆฌ

Min Heap

import heapq

heap = []

heapq.heappush(heap, value)

value = heapq.heappop(heap)

minimum = heap[0]

List โ†’ Heap

arr = [5, 3, 1, 7, 2]

heapq.heapify(arr)

Max Heap

heapq.heappush(heap, -value)

maximum = -heapq.heappop(heap)

Priority Queue

heapq.heappush(heap, (priority, value))

priority, value = heapq.heappop(heap)

์‹œ๊ฐ„๋ณต์žก๋„

์ตœ์†Ÿ๊ฐ’ ํ™•์ธ
โ†’ O(1)

heappush
โ†’ O(log N)

heappop
โ†’ O(log N)

heapify
โ†’ O(N)

๋งˆ๋ฌด๋ฆฌ

Heap์€

์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


ํŠนํžˆ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ

์ตœ์†Ÿ๊ฐ’ / ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์† ๊บผ๋‚ธ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ
์ตœ์†Ÿ๊ฐ’ / ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์† ๊ด€๋ฆฌํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ๋‹ค.

์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋‚˜์˜จ๋‹ค๋ฉด Heap์„ ๋– ์˜ฌ๋ ค๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Queue
โ†’ ๋จผ์ € ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ

Priority Queue
โ†’ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ

Heap
โ†’ Priority Queue๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

Python์—์„œ๋Š” heapq๋ฅผ ์ด์šฉํ•ด Min Heap์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ๋Š” ์šฐ์„ 

heapq.heappush()
heapq.heappop()
heapq.heapify()
heap[0]

์ •๋„๋ฅผ ์ตํ˜€๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Heap ๋ฌธ์ œ์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์ž์ฒด๋ฅผ ์™ธ์šฐ๋Š” ๊ฒƒ๋ณด๋‹ค

"์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€?"

๋ฅผ ๋ฌธ์ œ์—์„œ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€