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