
πνμ μ΄μ§νΈλ¦¬μ ν μ’ λ₯λ‘ λ£¨νΈλ Έλκ° μΈμ λ μ΅λκ°λλ μ΅μκ°μ κ°μ§λλ€.(μ΅λ ν, μ΅μ ν μ΄λΌκ³ νλ€.) κ·Έλ¦¬κ³ νΈλ¦¬λ μμ μ΄μ§νΈλ¦¬μ¬μΌν©λλ€.
μ¬κΈ°μλ μ΅λ νλ§ κ΅¬νν΄ λ³΄μμ΅λλ€.
μ΅λ νμ ꡬννκΈ° μ μ μ±μ§κ³Ό νΉμ§μ λν΄ μκΈ°νκ³ μ ν©λλ€.
λΆκ°μ μ μ½ μ‘°κ±΄, μ¦ μμ μ΄μ§ νΈλ¦¬ (complete binary tree) μ¬μΌ νλ€λ μ μ½ λλ¬Έμ, n κ°μ λ Έλλ‘ μ΄λ£¨μ΄μ§ μ΅λ νμ λμ΄ (κΉμ΄) λ log(n) + 1 (μμ μμ λΆλΆμ λ²λ¦Ό) λ‘ μ ν΄μ§λλ€. μ΄ μ±μ§ λλ¬Έμ λ°μ΄ν° μμμ μ½μ /μμ μ°μ°μ μ€ν μκ°μ μΈμ λ log(n) μ λΉλ‘ν©λλ€. λ°λΌμ, μ΄λ€ μ΅λ νμ΄ μ‘΄μ¬ν λ, μ΄ νμΌλ‘λΆν° λ°λ³΅μ μΌλ‘ λ£¨νΈ λ Έλλ₯Ό μμ νλ©΄ (μ λ°μ΄ν° μμλ€μ κΊΌλ΄λ©΄) λ£¨νΈ λ Έλμ λ€μ΄ μλ ν€κ° ν λ΄μμ μ΅λμμ΄ λ³΄μ₯λμ΄ μμΌλ―λ‘ λ°μ΄ν°λ₯Ό λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬ν μ μκ³ , μ΄ μ λ ¬μ μμλλ μκ° λν log(n) μ λΉλ‘ν©λλ€.
νμ΄ νμ μμ μ΄μ§ νΈλ¦¬λΌλ μ±μ§μ νΈλ¦¬μ ννμ μμ΄μλ μ΄μ μ μ 곡ν©λλ€. (λμμ κ°μμμ μκ°λ ) κ·μΉμ λ°λΌ λ Έλλ€μ λ²νΈλ₯Ό λ§€κΈ°λ©΄, μ΄ λ²νΈ μμλ‘ μ΄λ£¨μ΄μ§ μ ν λ°°μ΄μ νΈλ¦¬λ₯Ό ννν μ μμ΅λλ€. λν, μμ μ΄μ§ νΈλ¦¬μ΄λ―λ‘ λ Έλμ μΆκ°μ μμ λ λ°°μ΄μ 맨 λ§μ§λ§ μμμμλ§ μΌμ΄λ©λλ€.
μ΅λ ν ꡬνμ μμ΄μ λ°°μ΄μ μ΄μ©ν μ΄μ§νΈλ¦¬λ‘ ꡬννμ΅λλ€.
class MaxHeap:
def __init__(self):
self.data = [None]
def insert(self, item):
# ν°νΈ - pythonμμ λ λ³μμ κ° λ°κΎΈκΈ°
# a = 3, b = 5
# a, b = b, a
self.data.append(item)
index = len(self.data) -1
while index != 1:
numOfParentNode = index//2
print(numOfParentNode)
if self.data[numOfParentNode] < self.data[index]:
self.data[numOfParentNode], self.data[index] = self.data[index], self.data[numOfParentNode]
index = numOfParentNode
else:
break
def remove(self):
if len(self.data) > 1:
self.data[1], self.data[-1] = self.data[-1], self.data[1] #μ΅μλ¨ λ
Έλμ λ°κΏ
data = self.data.pop(-1) # λ§λ¨μΌλ‘ κ°μλ Max κ°μ μ κ±°
self.maxHeapify(1) # λ€μ MaxHeap λͺ¨μμΌλ‘ μ 리
else:
data = None
return data
def maxHeapify(self, i):
left = i*2
right = i*2+1
smallest = i
if left < len(self.data) and self.data[left] > self.data[smallest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallestλ μΌμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
smallest = left
# μ€λ₯Έμͺ½ μμμ΄ μ‘΄μ¬νλμ§, κ·Έλ¦¬κ³ μ€λ₯Έμͺ½ μμμ (ν€) κ°μ΄ λΆλͺ¨λ
Έλλ³΄λ€ λ ν°μ§λ₯Ό νλ¨ν©λλ€.
if right < len(self.data) and self.data[right] > self.data[smallest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallestλ μ€λ₯Έμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
smallest = right
if smallest!= i:
# νμ¬ λ
Έλ (μΈλ±μ€ i)μ μ΅λκ° λ
Έλ (μΌμͺ½ μλλ©΄ μ€λ₯Έμͺ½ μμ)λ₯Ό κ΅μ²΄ν©λλ€.
self.data[smallest], self.data[i] = self.data[i], self.data[smallest]
# μ¬κ·μ νΈμΆμ μ΄μ©νμ¬ μ΅λ νμ μ±μ§μ λ§μ‘±ν λκΉμ§ νΈλ¦¬λ₯Ό μ 리ν©λλ€.
self.maxHeapify(smallest)