μ€λ λ°°μλ³Ό κ²μ μ°μ μμ νλ₯Ό μν΄ λ§λ€μ΄μ§ μ λͺ ν μλ£κ΅¬μ‘°, Heap μλ£κ΅¬μ‘°μ΄λ€.
Heap
ν μλ£κ΅¬μ‘°λ? μ°μ μμ νλ₯Ό μν΄ λ§λ€μ΄μ§ μλ£κ΅¬μ‘°λ‘ μ΅λκ°κ³Ό μ΅μκ°μ λΉ λ₯΄κ² ꡬν μ μμΌλ©°, λ€μκ³Ό κ°μ μΈ κ°μ§μ νΉμ§μ κ°λλ€.
- μμ μ΄μ§ νΈλ¦¬λ₯Ό κΈ°λ°μΌλ‘ ꡬνλλ€.
- λμ¨ν μ λ ¬(λ°μ λ ¬) μνλ₯Ό μ μ§νλ€.
- μ€λ³΅λ κ°μ νμ©νλ€.
- λ°°μ΄λ‘ κ°μ₯ ν¨κ³Όμ μΈ κ΅¬νμ΄ κ°λ₯νλ€.
νμ μ’ λ₯
ν μλ£κ΅¬μ‘°λ λ κ°μ§μ μ’ λ₯λ₯Ό κ°λλ€.
μ΅λ ν
μ΅λ νμ΄λ, λΆλͺ¨ λ Έλμ κ° > μμ λ Έλμ κ°μΈ νμ μ΅λ νμ΄λΌκ³ νλ€.
μ΅μ ν
μ΅μ νμ΄λ μμ λ Έλμ κ° > λΆλͺ¨ λ Έλμ κ°μΈ νμ μ΅μ νμ΄λΌκ³ νλ€.
νμ νν λ°©λ²
νλ μ΄μ§ νΈλ¦¬(Binary Tree) μ΄λ―λ‘ μ°¨λ‘λλ‘ λ²νΈλ₯Ό λΆμ¬ν μ μκ³ μμ μ΄μ§ νΈλ¦¬λ₯Ό κΈ°λ°μΌλ‘ νκΈ° λλ¬Έμ κ°κ°μ λ Έλ μ€κ°μ λΉμ΄μλ λ Έλκ° μλ€.
μ΄ λ²νΈλ₯Ό λ°°μ΄μ μΈλ±μ€λ‘ μκ°νλ©΄ λ°°μ΄μ νμ λ Έλλ₯Ό μ½κ² μ μ₯νκ³ νμν μ μλ€.
κ·Έλμ νμ ꡬννλ κ°μ₯ ν¨κ³Όμ μΈ μλ£κ΅¬μ‘°λ λ°°μ΄μΈ μ΄μ λ μ΄ κ²μ΄λ€.
λν λ§μ§λ§μΌλ‘ νΉμ§μ΄ μλ€λ©΄ 0λ²μ§Έ μΈλ±μ€λ μμ보기 μ½κ²νκΈ° μν΄μ μ¬μ©νμ§ μκ³ λ°λ‘ 1λ²μ§Έ μΈλ±μ€λ‘ μ¬μ©νλ€.
μ΄ν΄λ₯Ό λκΈ° μν΄ μ¬μ©λ μ΄λ―Έμ§λ λ΄κ° κ°μ₯ μ’μνλ Heee'sλμ λΈλ‘κ·Έμ λ°μ·ν κ²μ΄λ€.
μΈλ±μ€ ꡬνκΈ°
νμλ μΈλ±μ€ λ²νΈλΌλ νΉμ§μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ λ€μκ³Ό κ°μ λ°©μμΌλ‘ μΈλ±μ€ μμΉλ₯Ό ꡬν μ μλ€.
- μΌμͺ½ μμμ μΈλ±μ€ : (λΆλͺ¨μ μΈλ±μ€) * 2
- μ€λ₯Έμͺ½ μμμ μΈλ±μ€ : (λΆλͺ¨μ μΈλ±μ€) * 2 + 1
javaλ₯Ό μ΄μ©ν heapμ ꡬν
MinHeap :: μ΅μ ν
μ΅μ νμ μμμ λ§ νλ κ² μ²λΌ 루λ ν λμ μ΅μκ°μ΄ μλ ννμ νμ λ»νλ€.
κ·ΈλΌ νμ μ±μ§μ λ§μ‘±νκΈ° μν΄μλ λ€μκ³Ό κ°μ νΉμ±μ κ°μ ΈμΌνλ€.
- μμ μ΄μ§ νΈλ¦¬μ ꡬ쑰
- λΆλͺ¨ λ Έλμ κ°μ΄ μμ λ Έλμ κ° λ³΄λ€ μμμΌ νλ€.
μ΅μ heapμ μ μ
class MinHeap {
private ArrayList<Integer> heap;
/*heap init*/
public MinHeap(){
heap = new ArrayList<>();
heap.add(0); // heap μ μΈλ±μ€λ μκΈ° μ½κ² 0λΆν° μμνλ€λ νΉμ±μ λ°λ₯Έλ€.
}
}
μλλΌλ©΄ μΌλ° λ°°μ΄μ μ¬μ©ν΄λ λμ§λ§ κ°λ
μ±μ μν΄μ λλ ArrayList
컬λ μ
μ μ¬μ©νμλ€.
μ΅μ Heapμ μ½μ μ°μ°
μΌλ°μ μΈ νμ μ°μ°μ μν΄μλ λΆλͺ¨ λ Έλμ μμ λ Έλ μ¬μ΄μ κ΄κ³λ₯Ό μ§μΌμ£Όλ μ°μ°μ΄ νμνλ€.
μ΄ λ§μ΄ 무μμ΄λλ©΄ μκΉ μμ λ§ νλ λΆλͺ¨ λ Έλμ κ°μ΄ μμ λ Έλμ κ°λ³΄λ€ μμμΌ νλ κ·Έλ° κ΄κ³λ₯Ό λ»νλ€.
μ°λ¦¬λ λΆλͺ¨ λ Έλμ μΈλ±μ€λ₯Ό μλ©΄ μμ λ Έλμ μΈλ±μ€λ₯Ό μ μ μλ€.
κ·Έλ¦¬κ³ μ°λ¦¬κ° μ§κΈκΉμ§ λ°°μ λ Heapμ νΉμ§μ μ μ ν μ μ©νλ©΄ μ½μ μ°μ°μ μ½κ² μ΄μ΄κ° μ μλ€.
κ³Όμ μ ν λ² λνλ΄ λ³Έλ€λ©΄
- μ½μ ν μμλ₯Ό Heapμ λ§μ§λ§ Indexμ μΆκ°μν¨λ€.
- λ§μ§λ§ Indexμμ / 2λ₯Ό νμ¬ λΆλͺ¨ λ Έλμ μΈλ±μ€λ₯Ό μ°Ύλλ€.
- λΆλͺ¨μ κ°κ³Ό λΉκ΅νμ¬ Heapμ νΉμ±μ λ§μ‘±μν¨λ€.
- μμ κ³Όμ μ λ°λ³΅νλ€. μ’ λ£ μ‘°κ±΄ : λ£¨νΈ λ Έλκ° λκ±°λ λΆλͺ¨ λ Έλμ κ°μ΄ νμ¬ λ Έλλ³΄λ€ μμ λ
class MinHeap {
private ArrayList<Integer> heap;
/*heap init*/
public MinHeap(){
heap = new ArrayList<>();
heap.add(0); // heap μ μΈλ±μ€λ μκΈ° μ½κ² 0λΆν° μμνλ€λ νΉμ±μ λ°λ₯Έλ€.
}
// insertion
private void insert(int data) {
heap.add(data);
int position = heap.size() - 1;
// λ£¨νΈ λ
ΈλκΉμ§ μ΄λνκ±°λ, λΆλͺ¨ Heapμ΄ μμ Heapλ³΄λ€ μμ λ κΉμ§
while(position > 1 && heap.get(position / 2) < heap.get(position)) {
/*λΆλͺ¨ λ
Έλμ μμ λ
Έλκ°μ swapμ μν μ°μ°*/
int temp = heap.get(position / 2);
heap.set(position / 2, heap.get(position));
heap.set(position, temp);
position /= 2;
}
}
}
μ΅μ Heapμ μμ μ°μ°
μ΅μ νμ μμ μ°μ°μ λ£¨νΈ λ Έλλ₯Ό μμ νλ κ²μ΄λ€.
λ£¨νΈ λ Έλλ₯Ό μμ νλ©΄ μ½μ μ°μ°κ³Ό λ§μ°¬κ°μ§λ‘ νΉμ μ λ§μ‘±μμΌμ£Όλ μ°μ°μ΄ μΌμ΄λλλ°, λ€μ ν λ² λ§ νμ§λ§ λΆλͺ¨ λ Έλμ κ°μ΄ μμ λ Έλμ κ°λ³΄λ€ μμμΌ νλ νΉμ±μ λ§μ‘± μμΌμΌ νλ κ²μ΄λ€.
μ΄ λ μ¬μ©νλ κ°λ μ΄ λ€μμ λ°°μΈ μ°μ μμ νμΈλ°, 미리 λ§μ λ³Έλ€ μκ°νκ³ κ³Όμ μ λ΄λ³΄μ.
- λ£¨νΈ λ Έλ μμ
- λ§λ¨ λ Έλ λ£¨νΈ λ Έλλ‘ λ³κ²½
- μμ κ°κ³Ό λΉκ΅νμ¬ Heapμ νΉμ±μ λ§μ‘±μν¨λ€.
- νΉμ±μ λ§μ‘±ν λ κΉμ§ μμ κ°μ κ³Όμ μ λ°λ³΅νλ€.
int delete() {
// heap μ¬μ΄μ¦κ° 1λ³΄λ€ μμΌλ©΄ μ¦, νμ κ°μ΄ μμΌλ©΄ return 0;
if(heap.size() - 1 < 1) {
return 0;
}
int deleteData = heap.get(1); // 루λ λ
Έλ μμ
heap.set(1, heap.get(heap.size() - 1)); // λ£¨νΈ λ
Έλμ μ리μ λ§λ¨ λ
Έλμ dataλ₯Ό μ€μ
heap.remove(heap.size() - 1); // λ§λ¨ λ
Έλ μμ
int position = 1;
while((position * 2) < heap.size()) { // νμ ν¬κΈ°λ³΄λ€ μμ λ κΉμ§
int min = heap.get(position * 2); // νμ¬ λ
Έλμ μΌμͺ½ μμ λ
Έλμ κ°
int minPos = position * 2; // νμ¬ λ
Έλμ μΌμͺ½ μμ λ
Έλμ μΈλ±μ€
// μ€λ₯Έμͺ½ μμ λ
Έλμ μΌμͺ½ μμ λ
Έλ μ€ λ ν° λ
Έλμ κ°κ³Ό λΉκ΅νκ³ κ΅ννκΈ° λλ¬Έμ μΌμͺ½ μμλ
Έλμ μ€λ₯Έμͺ½ μμ λ
Έλμ κ°μ λΉκ΅νλ κ³Όμ μ κ±°μΉλ€.
if(((position * 2 + 1) < heap.size()) && min > heap.get(position * 2 + 1)){ // μ€λ₯Έμͺ½ μμ λ
Έλκ° λ ν¬λ©΄ λ°κΏμ€μΌνλ€.
min = heap.get(position * 2 + 1); // μ€λ₯Έμͺ½ μμ λ
Έλλ‘ λ³κ²½
minPos = position * 2 + 1; // μμΉ λν μ€λ₯Έμͺ½ μμ λ
Έλλ‘ λ³κ²½
}
if(heap.get(position) < min) break; // νμ¬ λ
Έλλ³΄λ€ μμ λ
Έλμ κ°μ΄ λ ν¬λ©΄, νμ μ±μ§μ λ§μ‘±νλ©΄ λ°λ³΅ μ’
λ£
/*μμκ³Ό λΆλͺ¨μ SWAP κ³Όμ */
int temp = heap.get(position);
heap.set(position, heap.get(minPos));
heap.set(minPos, temp);
position = minPos;
}
return deleteData;
}
λκΈ