Search
Duplicate

Heap

์ƒ์„ฑ์ผ
2023/03/05 07:34
ํƒœ๊ทธ
์ž๋ฃŒ๊ตฌ์กฐ

Heap

Heap์€ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

ย ์šฐ์„ ์ˆœ์œ„ ํ (Priority Queue)

โ€ข
์šฐ์„ ์ˆœ์œ„ ํ๋Š” FIFO์ธ ์ผ๋ฐ˜ ํ์™€ ๋‹ฌ๋ฆฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” ์ถ”์ƒ์ž๋ฃŒํ˜•์ด๋‹ค.
โ€ข
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ํž™ ๋“ฑ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
*์ถ”์ƒ์ž๋ฃŒํ˜•(Abstract Data Type, ADT)์€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ์ž๋ฃŒ๊ตฌ์กฐ์˜ ํŠน์„ฑ๊ณผ ์—ฐ์‚ฐ์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด๋‹ค. Stack๊ณผ Queue ๋“ฑ์ด ํ•ด๋‹นํ•œ๋‹ค.
์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•„๋ž˜์˜ ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค.
โ€ข
enqueue() : ์ƒˆ ์š”์†Œ ์‚ฝ์ž…
โ€ข
dequeue() : ๋ฃจํŠธ์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜
โ€ข
peek() : ๋ฃจํŠธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜
๊ตฌํ˜„ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
์ž๋ฃŒ๊ตฌ์กฐ
enqueue()
dequeue()
๋ฐฐ์—ด (unsorted array)
O(1)
O(N)
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (unsorted linked list)
O(1)
O(N)
์ •๋ ฌ๋œ ๋ฐฐ์—ด (sorted array)
O(N)
O(1)
์ •๋ ฌ๋œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (sorted linked list)
O(N)
O(1)
ํž™ (heap)
O(logN)
O(logN)

ย ํž™ (Heap)

โ€ข
ํž™์€ ์ด์ง„ํŠธ๋ฆฌ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๋ฅผ ๋ฃจํŠธ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  ํ•ญ์ƒ ๋ฃจํŠธ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ„๋‹ค.
โ€ข
์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๊ธฐ ์œ„ํ•ด ์š”์†Œ๊ฐ€ ์‚ฝ์ž… ๋ฐ ์‚ญ์ œ ๋˜๋Š” ์‹œ์ ์— ๋ฐ”๋กœ ์ •๋ ฌ๋œ๋‹ค.
โ€ข
๋ฃจํŠธ๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๋˜๋Š” ์ตœ๋Œ€ ํž™(Max Heap)๊ณผ ๋ฃจํŠธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด ๋˜๋Š” ์ตœ์†Œ ํž™(Min Heap)์ด ์žˆ๋‹ค.

ย ํž™ ์š”์†Œ ์ถ”๊ฐ€ push()

1.
์ถ”๊ฐ€ํ•  ์š”์†Œ๋ฅผ ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ •์ ์— ์ž…๋ ฅํ•œ๋‹ค.
2.
์ถ”๊ฐ€ํ•œ ์š”์†Œ๊ฐ€ ๋ถ€๋ชจ ์š”์†Œ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๋ฉด ๋ถ€๋ชจ์™€ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พผ๋‹ค.
3.
์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ๋ฃจํŠธ๊ฐ€ ๋œ๋‹ค.
โ†’ ์š”์†Œ๊ฐ€ ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ ์ •์ ์— ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํž™์€ ํ•ญ์ƒ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๋ฉฐ, ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” log N ์ด๋ฏ€๋กœ ํž™์˜ ์š”์†Œ ์ถ”๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(log N) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

ย ํž™ ์š”์†Œ ์ œ๊ฑฐ pop()

1.
๋ฃจํŠธ ์ •์ ์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
2.
๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ •์ ์˜ ์š”์†Œ๋ฅผ ๋ฃจํŠธ๋กœ ์˜ฎ๊ธด๋‹ค.
3.
๋ฃจํŠธ ์š”์†Œ์˜ ๋‘ ์ž์‹ ์ค‘ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ์ •์ ๊ณผ ๋ฐ”๊พผ๋‹ค.
4.
๋‘ ์ž์‹ ์š”์†Œ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋‚ฎ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
โ†’ ํž™์˜ ์š”์†Œ ์ œ๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ถ”๊ฐ€์™€ ๋™์ผํ•˜๊ฒŒ O(log N) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

ย Heap์˜ ์‘์šฉ

ํž™์€ ์ตœ๋Œ€ ์ตœ์†Œ ๊ฐ’์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ, Dijkstra ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์˜ Prim ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์˜ ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์œ ์šฉํ•˜๋‹ค.
๋˜ํ•œ Heapsort ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ Huffman ์ฝ”๋”ฉ(๋ฐ์ดํ„ฐ ์••์ถ• ๊ธฐ์ˆ )์—๋„ ์‚ฌ์šฉ๋œ๋‹ค.

ย Heap ๊ตฌํ˜„

์ด์ง„ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋˜๊ณ , ๋ฐฐ์—ด๋กœ ์ €์žฅํ•ด๋„ ๋œ๋‹ค.
ํŒŒ์ด์ฌ์—์„œ๋Š” heapq ๋ชจ๋“ˆ์„ ํ†ตํ•ด heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
heapq ๋ชจ๋“ˆ์€ ์ตœ์†Œํž™์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ ํž™์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค. (y = -x ๋ณ€ํ™˜)
import heapq heap = [] heapq.heappush(heap, 50) heapq.heappush(heap, 10) heapq.heappush(heap, 20) result = heapq.heappop(heap)
Python
๋ณต์‚ฌ
ย ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉ
class MaxHeap { constructor() { this.heap = [null]; } swap(a, b) { [this.heap[a], this.heap[b]] = [this.heap[b], this.heap[a]]; } push(value) { this.heap.push(value); let currentIndex = this.heap.length-1; let parentIndex = Math.floor(currentIndex / 2); while (parentIndex !== 0 && this.heap[parentIndex] < value) { swap(currentIndex, parentIndex); currentIndex = parentIndex; parentIndex = Math.floor(currentIndex / 2); } } pop() { const returnValue = this.heap[1]; this.heap[1] = this.heap.pop(); let currentIndex = 1; let leftIndex = 2; let rightIndex = 3; while ( this.heap[currentIndex] < this.heap[leftIndex] || this.heap[currentIndex] < this.heap[rightIndex] ) { if (this.heap[leftIndex] < this.heap[rightIndex]) { swap(currentIndex, rightIndex); currentIndex = rightIndex; } else { swap(currentIndex, leftIndex); currentIndex = leftIndex; } leftIndex = currentIndex * 2; rightIndex = currentIndex * 2 + 1; } } }
JavaScript
๋ณต์‚ฌ

ref)