DOing
[μλ£κ΅¬μ‘°] μ°μ μμ ν, ν λ³Έλ¬Έ
π‘ μ°μ μμ ν?
μΌλ°μ μΈ νλ First-In-First-Outꡬ쑰μ΄μ§λ§,
μ°μ μμ ν(Priority Queue)λ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λμ€λ ꡬ쑰μ΄λ€.
μ°μ μμ νλ₯Ό λ°°μ΄μ΄λ μ°κ²°λ¦¬μ€νΈλ‘ ꡬνν μμλ μ°μ μμμ λ§κ² λ°μ΄ν°λ₯Ό μ½μ νλ μκ°μ΄ μ€λκ±Έλ¦¬κ² λλ€.
λλ¬Έμ μ°μ μμ νλ νμ μ΄μ©ν΄μ ꡬννλ€.
π‘ ν?
νμ μ΅λκ°κ³Ό μ΅μκ°μ λΉ λ₯΄κ² μ°ΎκΈ° μν΄ κ³ μλ μμ μ΄μ§νΈλ¦¬μ΄λ€.
(=λ³νλ νΈλ¦¬μ νν)
[ νμ ꡬ쑰 ]
: μ΅λκ°μ ꡬνκΈ° μν κ΅¬μ‘°μΈ μ΅λνκ³Ό μ΅μκ°μ ꡬνκΈ° μν κ΅¬μ‘°μΈ μ΅μνμ΄ μλ€.
νμ λ€μκ³Ό κ°μ΄ λκ°μ§ 쑰건μ κ°μ§κ³ μλ μλ£κ΅¬μ‘°μ΄λ€. (μ΅λν κΈ°μ€)
1) λΆλͺ¨λ Έλλ μμλ Έλμ κ°λ³΄λ€ ν¬κ±°λ κ°λ€.
2) μμ μ΄μ§ νΈλ¦¬νν
[ νκ³Ό μ΄μ§ νμ νΈλ¦¬ λΉκ΅ ]
* 곡ν΅μ : μ΄μ§νΈλ¦¬λ€.
* μ°¨μ΄μ :
- νμ κ° λ Έλμ κ°μ΄ μμλ Έλλ³΄λ€ ν¬κ±°λ κ°λ€.
- μ΄μ§ νμ νΈλ¦¬λ μΌμͺ½ μμλ Έλμ κ°μ΄ κ°μ₯ μκ³ , λΆλͺ¨λ Έλ, μ€λ₯Έμͺ½ μμλ Έλ μμ΄λ€.
- νμ μΌμͺ½ μμμ΄ ν΄μ§ μ€λ₯Έμͺ½ μμμ΄ ν΄μ§λ λͺ¨λ₯Έλ€.
* λͺ©μ : μ΄μ§ νμ νΈλ¦¬λ νμμ μν ꡬ쑰, νμ μ΅λ/μ΅μκ° κ²μμ μν ꡬ쑰λ€.
π‘ νμ λμ
[ λ°μ΄ν° μ½μ ]
1. μμ μ΄μ§νΈλ¦¬λ‘ λ§λ λ€.
: λΆλͺ¨λ Έλλ³΄λ€ ν¬λλΌλ μΌλ¨μ, μμ μ΄μ§νΈλ¦¬λ‘ λ§λ€κ³ μμνλ€. κ·Έλμ μΌμͺ½ μ΅νλ¨λΆ λ ΈλλΆν° μ±μ΄λ€.
2. μμλ Έλκ° λΆλͺ¨λ Έλλ³΄λ€ ν¬λ€λ©΄ λ°κΏμ€λ€.
: 20κ³Ό 8μ λ°κΎΈκ³ , 20κ³Ό 15μ λ°κΏμ€λ€. λ£¨νΈ λ Έλκ° λ λκΉμ§ 쑰건μ 체ν¬ν΄μ€λ€.
[ λ°μ΄ν° μμ ]
1. λ£¨νΈ λ Έλλ₯Ό μμ νλ€.(=μ΅λκ°μ λ½μλΈλ€)
2. μ΅νλ¨λΆμ λ Έλλ₯Ό 루νΈλ‘ μ€μ νλ€.
3. μμλ Έλκ° λΆλͺ¨λ³΄λ€ ν¬λ€λ©΄, μμλ Έλ λ μ€ λ ν° κ°κ³Ό λ°κΎΌλ€.
: 15κ° 10λ³΄λ€ ν¬κΈ° λλ¬Έμ 15μ 8μ λ°κΎΌλ€. μμλ Έλκ° μμλκΉμ§ μ΄λ₯Ό λ°λ³΅νλ€.
π‘ νμ ꡬν(with Python)
class Heap:
def __init__(self, data):
self.heap_array = list()
self.heap_array.append(None) # 1λΆν° μμν μμ
self.heap_array.append(data)
# 루νΈλ
Έλκ° μμλ
Έλλ μμΉλ₯Ό λ³κ²½ν΄μΌνλκ°λ₯Ό νλ¨
def move_down(self, popped_idx):
left_child_popped_idx = popped_idx * 2
right_child_popped_idx = popped_idx * 2 + 1
# case1: μΌμͺ½ μμ λ
Έλλ μμ λ
if left_child_popped_idx >= len(self.heap_array):
return False
# case2: μ€λ₯Έμͺ½ μμ λ
Έλλ§ μμ λ (μμ μ΄μ§νΈλ¦¬λΌλ κ²μ μ μνμ)
elif right_child_popped_idx >= len(self.heap_array):
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
return True # μμλ
Έλκ° λ ν¬λκΉ λ°κΏμ€μΌν¨
else:
return False
# case3: μΌμͺ½, μ€λ₯Έμͺ½ μμ λ
Έλ λͺ¨λ μμ λ
else:
# μμλ
ΈλλΌλ¦¬ λΉκ΅
if self.heap_array[left_child_popped_idx] > self.heap_array[right_child_popped_idx]:
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
return True # μμλ
Έλκ° λ ν¬λ€λ©΄ λ°κΏμ€μΌν¨
else:
return False
else:
if self.heap_array[popped_idx] < self.heap_array[right_child_popped_idx]:
return True # μμλ
Έλκ° λ ν¬λ€λ©΄ λ°κΏμ€μΌν¨
else:
return False
def pop(self):
if len(self.heap_array) <= 1:
return None
returned_data = self.heap_array[1]
self.heap_array[1] = self.heap_array[-1] # 루νΈλ
Έλλ₯Ό μ΅νλ¨ λ
Έλλ‘ λ³κ²½
del self.heap_array[-1]
popped_idx = 1
while self.move_down(popped_idx):
left_child_popped_idx = popped_idx * 2
right_child_popped_idx = popped_idx * 2 + 1
# case2: μ€λ₯Έμͺ½ μμ λ
Έλλ§ μμ λ
if right_child_popped_idx >= len(self.heap_array):
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[left_child_popped_idx] = self.heap_array[left_child_popped_idx], self.heap_array[popped_idx]
popped_idx = left_child_popped_idx
# case3: μΌμͺ½, μ€λ₯Έμͺ½ μμ λ
Έλ λͺ¨λ μμ λ
else:
# μμλ
ΈλλΌλ¦¬ λΉκ΅
if self.heap_array[left_child_popped_idx] > self.heap_array[right_child_popped_idx]:
if self.heap_array[popped_idx] < self.heap_array[left_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[left_child_popped_idx] = self.heap_array[left_child_popped_idx], self.heap_array[popped_idx]
popped_idx = left_child_popped_idx
else:
if self.heap_array[popped_idx] < self.heap_array[right_child_popped_idx]:
self.heap_array[popped_idx], self.heap_array[right_child_popped_idx] = self.heap_array[right_child_popped_idx], self.heap_array[popped_idx]
popped_idx = right_child_popped_idx
return returned_data
# νμ¬ λ
Έλκ° μμλ
Έλμ λ°κΏμΌνλμ§λ₯Ό νλ¨
def move_up(self, inserted_idx):
if inserted_idx <= 1: # 루νΈλ
Έλλ©΄ λ°κΏ λ
Έλκ° μλ€.
return False
parent_idx = inserted_idx // 2
if self.heap_array[inserted_idx] > self.heap_array[parent_idx]:
return True
else:
return False
def insert(self, data):
if len(self.heap_array) == 1: # λ°©μ΄μ½λ
self.heap_array.append(data)
return True
self.heap_array.append(data) # μΌλ¨ μμ μ΄μ§νΈλ¦¬λ‘ λ§λ λ€
inserted_idx = len(self.heap_array) - 1
while self.move_up(inserted_idx): # νμ¬λ
Έλλ₯Ό μμλ
Έλμ λ°κΏμΌνλ€κ³ νλ¨νλ€λ©΄
parent_idx = inserted_idx // 2
self.heap_array[inserted_idx], self.heap_array[parent_idx] = self.heap_array[parent_idx], self.heap_array[inserted_idx]
inserted_idx = parent_idx
return True
heap = Heap(15)
heap.insert(10)
heap.insert(20)
heap.insert(11)
print(heap.heap_array) # νμΈ [None,20,15,11,10]
print(heap.pop()) # 20
print(heap.heap_array) # νμΈ [None,15,11,10]
π‘ νμ μκ°λ³΅μ‘λ
μ°μ μ΅λ λ Έλμ κ°μκ° Nμ΄λΌλ©΄, νΈλ¦¬μ λμ΄ h = \( log_{2}(N+1)-1 \)μ΄λ€.
μ½μ μμ μ, μ΅μ μ κ²½μ°μλ rootλ Έλμμ leaf λ ΈλκΉμ§ λΉκ΅ν΄μΌν¨μΌλ‘ O(logn)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
λ¨μ λ°°μ΄μμ μ΅λ/μ΅μκ°μ μ°ΎμΌλ €λ©΄ O(n)μ μκ°λ³΅μ‘λλ₯Ό κ°μ§λ κ²μ λΉνλ©΄ ν¨μ¬ λΉ λ₯Έ μλλ‘ μ΅λ/μ΅μκ°μ μ°Ύμ μ μλ€.
π‘ νμ΄μ¬μμ ν μ¬μ©νκΈ°
* μ΅μν
import heapq
# μ΅μν
minHeap = []
heapq.heappush(minHeap, 2)
heapq.heappush(minHeap, 3)
heapq.heappush(minHeap, 1)
# μ΅μκ° μΆλ ₯
while minHeap:
print(heapq.heappop(minHeap), end=" ")
* μ΅λν
: νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬μμλ κΈ°λ³Έμ μΌλ‘ μ΅μνλ§ μ 곡νκ³ μλ€.
λλ¬Έμ μ΅μνμ μ΅λνμ²λΌ μ¬μ©νκΈ° μν΄μ μ°μ μμμ ν΄λΉνλ κ°μ μμ λΆνΈ(-)λ₯Ό λΆμ¬μ λ£μλ€κ°, κΊΌλΌλμ λ€μ μμ λΆνΈ(-)λ₯Ό λΆμ¬μ μλμ κ°μΌλ‘ λ리λ λ°©μμ μ¬μ©ν μ μλ€.
import heapq
# μ΅λν
maxHeap = []
heapq.heappush(maxHeap, -2)
heapq.heappush(maxHeap, -3)
heapq.heappush(maxHeap, -1)
# μ΅λκ° μΆλ ₯
while maxHeap:
print(-heapq.heappop(maxHeap), end=" ")
μΆμ²
μ€νλ₯΄ν μ½λ©ν΄λ½ μκ³ λ¦¬μ¦ κ°μ
ν¨μ€νΈμΊ νΌμ€ μκ³ λ¦¬μ¦ κ°μ
'μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] 그리λ(νμλ²) with Python (0) | 2021.05.20 |
---|---|
μ κ·ννμ (0) | 2021.05.19 |
[μλ£κ΅¬μ‘°] νΈλ¦¬ with Python (0) | 2021.05.18 |
[μλ£κ΅¬μ‘°] ν΄μ¬ ν μ΄λΈ with Python (0) | 2021.05.18 |
μκ° λ³΅μ‘λ - λΉ μ€νκΈ°λ² (0) | 2021.05.18 |