Heap

์ •์˜

  • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ.

  • ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์Šค์ผ€์ค„๋ง(ex: CPU ์Šค์ผ€์ค„๋ง)์— ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

  • ๊ฐ€์žฅ ํฐ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋‚˜์˜ค๋ฉด Max Heap(์ตœ๋Œ€ ํž™), ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๋‚˜์˜ค๋ฉด Min Heap(์ตœ์†Œ ํž™)์ด๋ผ๊ณ  ํ•œ๋‹ค.

๊ตฌํ˜„(Python) - Max Heap

๋‹ค์Œ์˜ ๋ณ€์ˆ˜๋“ค์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

HEAP_SIZE = 0 # ํž™์— ์กด์žฌํ•˜๋Š” ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
heap = [None] # ํž™ (0๋ฒˆ ์ธ๋ฑ์Šค ๋ฏธ์‚ฌ์šฉ)

์‚ฝ์ž…

# ํž™์— ์‚ฝ์ž… ์‹œ. ๋ฐ˜๋ณต ์ธ๋ฑ์Šค i๋Š” ๋ฐฉ๊ธˆ ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋ฃจํŠธ์˜ ์ž์‹๊นŒ์ง€
# 1. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์— ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…
# 2. (์ตœ๋Œ€ ํž™ ๊ธฐ์ค€) ๋ถ€๋ชจ์™€ ๋น„๊ตํ•ด์„œ ๋ถ€๋ชจ๋ณด๋‹ค ํฌ๋ฉด ๋ถ€๋ชจ์™€ swap
# 3. ๋ถ€๋ชจ๊ฐ€ ๋” ํฐ ๊ฐ’์ผ ๋•Œ๊นŒ์ง€ 2๋ฒˆ์„ ๋ฐ˜๋ณต
def push(data):
    global HEAP_SIZE
    HEAP_SIZE += 1
    heap.append(data)
    i = HEAP_SIZE
    while i > 1:
        parent = i//2
        if heap[i] <= heap[parent]:
            break
        heap[i], heap[parent] = heap[parent], heap[i]
        i = parent

์‚ญ์ œ

# ํž™์—์„œ ์‚ญ์ œ ์‹œ. ์ •ํ™•ํžˆ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ์˜ pop. ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๊บผ๋‚ด๋Š” ๊ฒƒ
# 1. ๋ฃจํŠธ ๋…ธ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๊ณ  ๋ฃจํŠธ ๋…ธ๋“œ ์œ„์น˜์— ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
# 2. ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ ์ฒ˜๋ฆฌ(ํž™ ํฌ๊ธฐ๋ฅผ 1 ์ค„์ธ๋‹ค).
# 3. ํž™์„ ์žฌ์ •๋ ฌํ•œ๋‹ค.
def pop():
    global HEAP_SIZE
    data = heap[1]
    heap[1] = heap[HEAP_SIZE]
    heap.pop()
    HEAP_SIZE -= 1
    sort()
    return data

# ์žฌ์ •๋ ฌ: ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ๋น„๊ตํ•˜๋ฉฐ swap
# ๋‚ด๊ฐ€ ๊ฐ€์žฅ ํฌ๋ฉด ๋‚ด๋น„๋‘๊ณ , ๋‚˜๋ณด๋‹ค ํฐ ์ž์‹์ด ์žˆ๋‹ค๋ฉด ๋” ํฐ ์ž์‹์ด๋ž‘ swapํ•œ๋‹ค.
# ๋‘ ์ž์‹์ด ๋ชจ๋‘ ๋‚˜๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋‘˜ ์ค‘ ๋” ํฐ ์ž์‹์„ ์œ„๋กœ ์˜ฌ๋ ค์•ผ max heap์ด ์œ ์ง€๋œ๋‹ค.
def sort():
    global HEAP_SIZE
    i = 1
    while i*2 <= HEAP_SIZE:
        max_index = i
        if heap[max_index] < heap[i*2]:
            max_index = i*2
        if i*2 < HEAP_SIZE and heap[max_index] < heap[i*2+1]:
            max_index = i*2+1
        if max_index == i:
            break
        heap[max_index], heap[i] = heap[i], heap[max_index]
        i = max_index

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

  • ์‚ฝ์ž…์€ ๋งจ ๋ฐ‘์—์„œ ๋งจ ์œ„๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š” ๊ณผ์ •์ด๋ฏ€๋กœ O(logN)์ด๋‹ค.

  • ์‚ญ์ œ๋Š” ์‚ญ์ œ ์ž์ฒด๋Š” O(1)์ด์ง€๋งŒ ์žฌ์ •๋ ฌ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์žฌ์ •๋ ฌ์€ ๋ฃจํŠธ๊ฐ€ ์ตœ๋Œ€ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๊นŒ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ณผ์ •์ด๋ฏ€๋กœ ๋งจ ์œ„์—์„œ ๋งจ ๋ฐ‘๊นŒ์ง€ ์˜ฌ๋ผ์˜ค๋Š” ๊ณผ์ •์ด๋‹ค. ๋”ฐ๋ผ์„œ, O(logN)์ด๋‹ค.

Last updated