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

μ‚­μ œ

μ‹œκ°„λ³΅μž‘λ„

  • μ‚½μž…μ€ 맨 λ°‘μ—μ„œ 맨 μœ„κΉŒμ§€ μ˜¬λΌμ˜€λŠ” κ³Όμ •μ΄λ―€λ‘œ O(logN)이닀.

  • μ‚­μ œλŠ” μ‚­μ œ μžμ²΄λŠ” O(1)μ΄μ§€λ§Œ μž¬μ •λ ¬ 과정이 ν•„μš”ν•˜λ‹€. μž¬μ •λ ¬μ€ λ£¨νŠΈκ°€ μ΅œλŒ€ λ§ˆμ§€λ§‰ λ…Έλ“œκΉŒμ§€ κ²€μ‚¬ν•˜λŠ” κ³Όμ •μ΄λ―€λ‘œ 맨 μœ„μ—μ„œ 맨 λ°‘κΉŒμ§€ μ˜¬λΌμ˜€λŠ” 과정이닀. λ”°λΌμ„œ, O(logN)이닀.

Last updated