ν°μ€ν 리 λ·°
ν(heap)λ μ΄μ§ νΈλ¦¬μ ν μ’ λ₯λ‘ μ΄μ§ ν(binary heap) μ΄λΌκ³ λ νλ€. νμ§λ§ μ΄μ§νμ νΉλ³ν 쑰건λ€μ λ§μ‘±νλ μ΄μ§ νΈλ¦¬μ΄λ€.
- 루λ(root) λ Έλκ° μΈμ λ μ΅λκ° λλ μ΅μκ°μ κ°μ§λ€. μ΅λκ°μ κ°μ§λ©΄ μ΅λ ν(max heap), μ΅μκ°μ κ°μ§λ©΄ μ΅μ ν(min heap)μ΄λ€.
- μμ μ΄μ§ νΈλ¦¬μ¬μΌ νλ€.
- μ΅λ ν λ΄μ μμμ λ Έλλ₯Ό 루νΈλ‘ νλ μλΈνΈλ¦¬ λν μ΅λνμ΄λ€. (μ¬κ·μ μΌλ‘λ μ μκ° λ¨)
μ΄μ§ νμ νΈλ¦¬μμ λΉκ΅
- μμλ€μ μμ ν ν¬κΈ° μμΌλ‘ μ λ ¬λμ΄μλκ°? μ΄μ§νμμ κ·Έλ μ§λ§ νμ κ·Έλ μ§ μλ€.
- νΉμ ν€ κ°μ κ°μ§λ μμλ₯Ό λΉ λ₯΄κ² κ²μν μ μλκ°? μ΄μ§νμνΈλ¦¬λ κ°λ₯, νμ λΆκ°
- λΆκ°μ μ μ½ μ‘°κ±΄μ μ΄λ€ κ²μΈκ°? νμ μ΄μ§νμνΈλ¦¬μ λΉν΄ μμ μ΄μ§νΈλ¦¬μ¬μΌνλ€λ μ μ½μ‘°κ±΄μ΄ μλ€.
μ΅λ ν(Max Heap)μ μΆμμ μλ£κ΅¬μ‘°
μ°μ°μ μ μ
- __init__() - λΉ μ΅λ νμ μμ±
- insert(item) - μλ‘μ΄ μμλ₯Ό μ½μ
- remove() - μ΅λ μμ(root node)λ₯Ό λ°ννκ³ μμ
λ°μ΄ν° ννμ μ€κ³
λ°°μ΄μ μ΄μ©ν μ΄μ§ νΈλ¦¬μ νν
class MaxHeap:
# λΉ νμ μμ±
def __init__(self):
self.data = [None]
μ΅λ νμ μμ μ½μ
νΈλ¦¬μ λ§μ§λ§ μ리μ μλ‘μ΄ μμλ₯Ό μμλ‘ μ μ₯
λΆλͺ¨ λ Έλμ ν€ κ°μ λΉκ΅νμ¬ μλ‘, μλ‘ μ΄λ
class MaxHeap:
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
μ΅λ νμ μμ μ½μ μ 볡μ‘λ
μμμ κ°μκ° nμΈ μ΅λ νμ μλ‘μ΄ μμ μ½μ -> λΆλͺ¨ λ Έλμ λμ λΉκ΅ μ΅λ νμ : log(2)N
μ΅μ 볡μ‘λ O(logN)μ μ½μ μ°μ°
μ΅λ νμμ μμμ μμ
λ£¨νΈ λ Έλμ μ κ±° - μ΄κ²μ΄ μμλ€ μ€ μ΅λκ°
νΈλ¦¬ λ§μ§λ§ μ리 λ Έλλ₯Ό μμλ‘ λ£¨νΈ λ Έλμ μ리μ λ°°μΉ
μμ λ Έλλ€κ³Όμ κ° λΉκ΅μ μλλ‘, μλλ‘ μ΄λ (μμμ λμ΄ μμ μ μλλ° λ ν°κ°μ κΈ°μ€μΌλ‘ μ΄λνλ€)
class MaxHeap:
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)
self.maxHeapify(1)
else:
data = None
return data
def maxHeapify(self, i):
# iλ μ΄λ κΈ°μ€μΌλ‘ λ°κΏκ±΄κ°
# μΌμͺ½ μμ (left child) μ μΈλ±μ€λ₯Ό κ³μ°ν©λλ€.
left = i * 2
# μ€λ₯Έμͺ½ μμ (right child) μ μΈλ±μ€λ₯Ό κ³μ°ν©λλ€.
right = i * 2 + 1
greatest = i
# μμ (i), μΌμͺ½μμ(left), μ€λ₯Έμͺ½μμ(right) μ€ μ΅λλ₯Ό μ°Ύμμ μ΄κ²μ μΈλ±μ€λ₯Ό smallestμ λ΄λλ€
# μΌμͺ½ μμμ΄ μ‘΄μ¬νλμ§, κ·Έλ¦¬κ³ μΌμͺ½ μμμ (ν€) κ°μ΄ (무μ보λ€?) λ ν°μ§λ₯Ό νλ¨ν©λλ€.
if left < len(self.data) and self.data[left] > self.data[greatest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallest λ μΌμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
greatest = left
# μ€λ₯Έμͺ½ μμμ΄ μ‘΄μ¬νλμ§, κ·Έλ¦¬κ³ μ€λ₯Έμͺ½ μμμ (ν€) κ°μ΄ (무μ보λ€?) λ ν°μ§λ₯Ό νλ¨ν©λλ€.
if right < len(self.data) and self.data[right] > self.data[greatest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallest λ μ€λ₯Έμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
greatest = right
# λ§μ½ μ΄ μΈλ±μ€κ° iμ κ°μ§ μλ€λ©΄ μμλ€ μ€μ λλ³΄λ€ ν° ν€κ°μ κ°μ§ λ
Έλκ° λ°κ²¬λ κ²½μ°
if greatest != i:
# νμ¬ λ
Έλ (μΈλ±μ€ i) μ μ΅λκ° λ
Έλ (μΌμͺ½ μλλ©΄ μ€λ₯Έμͺ½ μμ) λ₯Ό κ΅μ²΄ν©λλ€.
self.data[i], self.data[greatest] = self.data[greatest], self.data[i]
# μ¬κ·μ νΈμΆμ μ΄μ©νμ¬ μ΅λ νμ μ±μ§μ λ§μ‘±ν λκΉμ§ νΈλ¦¬λ₯Ό μ 리ν©λλ€.
self.maxHeapify(greatest)
μ΅λ νμΌλ‘λΆν° μμ μμ 볡μ‘λ
μμμ κ°μκ° nμΈ μ΅λ νμμ μ΅λ μμ μμ λ μμ λ Έλλ€κ³Όμ λμ λΉκ΅ μ΅λ νμλ 2 * log(2)Nμ΄λ€.
μ΅μ 볡μ‘λ O(logN)μ μμ μ°μ°
μ΅λ/μ΅μ νμ μμ©
1. μ°μ μμ ν(priority queue)
- enqueue ν λ "λμ¨ν μ λ ¬"μ μ΄λ£¨κ³ μλλ‘ ν¨ : O(logN)
- dequeue ν λ μ΅λκ°μ μμλλ‘ μΆμΆ : O(logN)
- μ 16κ°μμμ μλ°©ν₯ μ°κ²° 리μ€νΈ μ΄μ© ꡬνκ³Ό ν¨μ¨μ± λΉκ΅
2. ν μ λ ¬ (heap sort)
- μ λ ¬λμ§ μμ μμλ€μ μ무 μμλ‘λ μ΅λ νμ μ½μ : O(logN)
- μ½μ μ΄ λλλ©΄, νμ΄ λΉκ² λ λκΉμ§ νλμ© μμ : O(logN)
- μμλ€μ΄ μμ λ μμκ° μμλ€μ μ λ ¬ μμ
- μ λ ¬ μκ³ λ¦¬μ¦ λ³΅μ‘λ : O(logN)
def heapSort(unsorted):
H = MaxHeap()
for item in unsorted:
H.insert(item)
sorted = []
d = H.remove()
while d:
sorted.append(d)
d = H.remove()
return sorted
μ 체 μ½λ
class MaxHeap:
# λΉ νμ μμ±
def __init__(self):
self.data = [None, 30, 24,12,18,21,8,6,4,2,19]
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)
self.maxHeapify(1)
else:
data = None
return data
def maxHeapify(self, i):
# iλ μ΄λ κΈ°μ€μΌλ‘ λ°κΏκ±΄κ°
# μΌμͺ½ μμ (left child) μ μΈλ±μ€λ₯Ό κ³μ°ν©λλ€.
left = i * 2
# μ€λ₯Έμͺ½ μμ (right child) μ μΈλ±μ€λ₯Ό κ³μ°ν©λλ€.
right = i * 2 + 1
greatest = i
# μμ (i), μΌμͺ½μμ(left), μ€λ₯Έμͺ½μμ(right) μ€ μ΅λλ₯Ό μ°Ύμμ μ΄κ²μ μΈλ±μ€λ₯Ό smallestμ λ΄λλ€
# μΌμͺ½ μμμ΄ μ‘΄μ¬νλμ§, κ·Έλ¦¬κ³ μΌμͺ½ μμμ (ν€) κ°μ΄ (무μ보λ€?) λ ν°μ§λ₯Ό νλ¨ν©λλ€.
if left < len(self.data) and self.data[left] > self.data[greatest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallest λ μΌμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
greatest = left
# μ€λ₯Έμͺ½ μμμ΄ μ‘΄μ¬νλμ§, κ·Έλ¦¬κ³ μ€λ₯Έμͺ½ μμμ (ν€) κ°μ΄ (무μ보λ€?) λ ν°μ§λ₯Ό νλ¨ν©λλ€.
if right < len(self.data) and self.data[right] > self.data[greatest]:
# μ‘°κ±΄μ΄ λ§μ‘±νλ κ²½μ°, smallest λ μ€λ₯Έμͺ½ μμμ μΈλ±μ€λ₯Ό κ°μ§λλ€.
greatest = right
# λ§μ½ μ΄ μΈλ±μ€κ° iμ κ°μ§ μλ€λ©΄ μμλ€ μ€μ λλ³΄λ€ ν° ν€κ°μ κ°μ§ λ
Έλκ° λ°κ²¬λ κ²½μ°
if greatest != i:
# νμ¬ λ
Έλ (μΈλ±μ€ i) μ μ΅λκ° λ
Έλ (μΌμͺ½ μλλ©΄ μ€λ₯Έμͺ½ μμ) λ₯Ό κ΅μ²΄ν©λλ€.
self.data[i], self.data[greatest] = self.data[greatest], self.data[i]
# μ¬κ·μ νΈμΆμ μ΄μ©νμ¬ μ΅λ νμ μ±μ§μ λ§μ‘±ν λκΉμ§ νΈλ¦¬λ₯Ό μ 리ν©λλ€.
self.maxHeapify(greatest)
def heapSort(unsorted):
H = MaxHeap()
for item in unsorted:
H.insert(item)
sorted = []
d = H.remove()
while d:
sorted.append(d)
d = H.remove()
return sorted
h = MaxHeap()
h.insert(50)
print(h.data)
h.remove()
print(h.data)
h.remove()
print(h.data)
'(ꡬ)μλ£κ΅¬μ‘°&μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€][Python] μμμ°ΎκΈ° (0) | 2020.06.30 |
---|---|
[νλ‘κ·Έλλ¨Έμ€][Python] λͺ¨μκ³ μ¬ (0) | 2020.06.30 |
μ΄μ§ νμ νΈλ¦¬ (Binary Search Trees) (0) | 2020.06.27 |
μ΄μ§νΈλ¦¬μ μν (Traversal) - λμ΄ μ°μ μν (BFT) (0) | 2020.06.26 |
μ΄μ§νΈλ¦¬μ μν (Traversal) - κΉμ΄ μ°μ μν (DFT) (0) | 2020.06.25 |
- Total
- Today
- Yesterday
- κ°λ°ν경ꡬμΆ
- tomcatμ€μΉ
- mysqlμ€μΉ
- κ²μν μμ
- μ΄ν΄λ¦½μ€ μ€μΉ
- κ²μλ¬Όμ‘°ν
- typeAliases
- Algorithm
- κ°λ°
- μ€νλ§λΆνΈ μλμμ±
- μλ£κ΅¬μ‘°
- java jdk μ€μΉ
- κ²μν μ‘°ν
- κ²μλ¬Ό μμ
- Java
- λΆνΈ μλμμ±
- κ²μνλ§λ€κΈ°
- μλ°
- μκ³ λ¦¬μ¦
- μ 체κ²μλ¬Ό μ‘°ν
- μ¨λ¦¬μμ€
- java νκ²½λ³μ
- λ³λͺ μ²λ¦¬
- μ΄ν΄λ¦½μ€ νκΈ μΈμ½λ©
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |