μλ£κ΅¬μ‘° ν(Heap) μ΄λ?
- μμ μ΄μ§ νΈλ¦¬(λ§μ§λ§ λ 벨μ μ μΈνκ³ λͺ¨λ λ λ²¨μ΄ μμ ν μ±μμ Έ μλ νΈλ¦¬μ νν)μ μΌμ’ μΌλ‘ μ°μ μμ ν(Priority Queue)λ₯Ό μνμ¬ λ§λ€μ΄μ§ μλ£κ΅¬μ‘°
- μ¬λ¬ κ°μ κ°λ€ μ€μμ μ΅λκ°μ΄λ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμλ΄λλ‘ λ§λ€μ΄μ§ μλ£κ΅¬μ‘°μ΄λ€.
- νμ νμ λ Έλ κ°μ μ°μ μμλ₯Ό κ³ λ €νμ§ μκ³ λΆλͺ¨ λ Έλμ μμ λ Έλμ ν€ κ°λ§ κ³ λ €νλ€. μ΄λ¬ν μ λ ¬ μνλ₯Ό λ°μ λ ¬ μν νΉμ λμ¨ν μ λ ¬ μν λλ μ½ν νμ΄λΌκ³ λΆλ¦°λ€.
- ν νΈλ¦¬μμλ μ€λ³΅λ κ°μ νμ©νλ€.
Heapμ μ’ λ₯
- μ΅λ ν(max heap)
- λΆλͺ¨ λ Έλμ ν€κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ ν¬κ±°λ κ°μ μμ μ΄μ§ νΈλ¦¬
- key(λΆλͺ¨ λ Έλ) >= key(μμ λ Έλ)
- μ΅μ ν(min heap)
- λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ μκ±°λ κ°μ μμ μ΄μ§ νΈλ¦¬
- key(λΆλͺ¨ λ Έλ) <= key(μμ λ Έλ)
Heapμ ꡬν
- νμ μ μ₯νλ νμ€μ μΈ μλ£κ΅¬μ‘°λ λ°°μ΄μ΄λ€.
- ꡬνμ μ½κ² νκΈ° μνμ¬ λ°°μ΄μ 첫 λ²μ§Έ μΈλ±μ€μΈ 0μ μ¬μ©λμ§ μλλ€. = μμ μΈλ±μ€(root)λ 1λΆν° μμνλ€.
- νΉμ μμΉμ λ
Έλ λ²νΈ(μΈλ±μ€)λ μλ‘μ΄ λ
Έλκ° μΆκ°λμ΄λ λ³νμ§ μλλ€.(λΆλ³)
- μλ₯Ό λ€μ΄ λ£¨νΈ λ Έλμ μ€λ₯Έμͺ½ λ Έλμ λ²νΈλ νμ 3μ΄λ€.
- λ°°μ΄ νμ μ±μ§
- μΌμͺ½ μμ λ Έλ μΈλ±μ€ = λΆλͺ¨ λ Έλμ μΈλ±μ€ * 2
- μ€λ₯Έμͺ½ μμμ λ Έλ μΈλ±μ€ = λΆλͺ¨ λ Έλμ μΈλ±μ€ * 2 + 1
- λΆλͺ¨ λ Έλμ μΈλ±μ€ = μμ λ Έλ μΈλ±μ€ / 2
Heapμ μ½μ μ°μ°
- μκ°λ³΅μ‘λ: O(logN)
- νμ μλ‘μ΄ μμκ° λ€μ΄μ€λ©΄, μΌλ¨ μλ‘μ΄ λ Έλλ₯Ό νμ λ§μ§λ§ λ Έλμ μ΄μ΄μ μ½μ νλ€.
- μλ‘μ΄ λ Έλλ₯Ό λΆλͺ¨ λ Έλλ€κ³Ό κ΅νν΄μ νμ μ±μ§μ λ§μ‘±μν¨λ€.
heap = [0,2,3,5,4,7,6] μ 1 μ½μ νκΈ°
- μ μΌ λ§μ§λ§ λ¨λ§ λ
Έλμ λ°μ΄ν°λ₯Ό μ½μ
νλ€.
- λΆλͺ¨ λ Έλλ κ³μ λΉκ΅νλ©΄μ λΆλͺ¨ λ Έλκ° μμ λ³΄λ€ ν¬λ€λ©΄ λΆλͺ¨μ μμ μ μμΉλ₯Ό swap
- 2λ² μ‘°κ±΄μ λ§μ‘±νμ§ μμ λκΉμ§ λλ μμ μ΄ λ£¨νΈ λ Έλκ° μλ λκΉμ§ λ°λ³΅νλ€.
Min Heap μ½μ ꡬν
class MinHeap {
private ArrayList<Integer> heap;
/*heap init*/
public MinHeap(){
// heap μ μΈλ±μ€λ μκΈ° μ½κ² 0λΆν° μμνλ€λ νΉμ±μ λ°λ₯Έλ€(0λ²μ§Έ μΈλ±μ€ κ° 0)
heap = new ArrayList<>(Arrays.asList(0,2,3,5,4,7,6));
}
// insertion
private void insert(int data) {
heap.add(data);
int position = heap.size() - 1;
// λ£¨νΈ λ
ΈλκΉμ§ μ΄λνκ±°λ, λΆλͺ¨ Heapμ΄ μμ Heapλ³΄λ€ μμ λ κΉμ§
while(position > 1 && heap.get(position) < heap.get(position / 2)) {
/*λΆλͺ¨ λ
Έλμ μμ λ
Έλκ°μ swapμ μν μ°μ°*/
int temp = heap.get(position / 2);
heap.set(position / 2, heap.get(position));
heap.set(position, temp);
position /= 2;
}
}
}
Heapμ μμ μ°μ°
- μκ°λ³΅μ‘λ: O(logN)
μ΅μ νμ μμ μ°μ°μ λ£¨νΈ λ Έλλ₯Ό μμ νλ κ²μ΄λ€. => μ΅λνλ λ§μ°¬κ°μ§
λ£¨νΈ λ Έλλ₯Ό μμ νλ©΄ μ½μ μ°μ°κ³Ό λ§μ°¬κ°μ§λ‘ νΉμ μ λ§μ‘±μμΌμ£Όλ μ°μ°μ΄ μΌμ΄λλλ°, λ€μ ν λ² λ§ νμ§λ§ λΆλͺ¨ λ Έλμ κ°μ΄ μμ λ Έλμ κ°λ³΄λ€ μμμΌ νλ νΉμ±μ λ§μ‘± μμΌμΌ νλ κ²μ΄λ€.
μ΄ λ μ¬μ©νλ κ°λ μ΄ λ€μμ λ°°μΈ μ°μ μμ νμΈλ°, 미리 λ§μ λ³Έλ€ μκ°νκ³ κ³Όμ μ λ΄λ³΄μ.
- λ£¨νΈ λ Έλ μμ
- λ§λ¨ λ Έλ λ£¨νΈ λ Έλλ‘ λ³κ²½
- μμ κ°κ³Ό λΉκ΅νμ¬ Heapμ νΉμ±μ λ§μ‘±μν¨λ€.
- νΉμ±μ λ§μ‘±ν λ κΉμ§ μμ κ°μ κ³Όμ μ λ°λ³΅νλ€.
heap = [0, 1, 3, 2, 4, 7, 6, 5] μμ μ΅μκ° μμ νκΈ°(min heap μμ )
- κ°μ Έμ¬ 'μ΅μκ°'μ 미리 μ μ₯ν΄μ€λ€.
2. κ°μ₯ λ§μ§λ§ λ
Έλμ κ°κ³Ό λ£¨νΈ λ
Έλμ κ°μ Swap ν΄μ€λ€.
1κ³Ό 5μ μμΉκ° λ°λμλ€.
κ°μ₯ λ§μ§λ§ λ
Έλμ λ£¨νΈ λ
Έλμ κ°μ λ°κΏμ£Όλ μ΄μ λ μμ μ΄μ§ νΈλ¦¬λ₯Ό μνλ₯Ό μ μ§νκΈ° μν΄μ μ΄λ€. Swapμ΄ λλ¬λ€λ©΄ λ§λ¨λ
Έλ(μ§κΈμ μ΅μκ°)λ ν μΌμ΄ λλ¬κΈ° λλ¬Έμ pop μμΌμ€λ λλ€!
3.νμ¬ λ
Έλμμ μμ λ
Έλμ λΉκ΅ νλ©΄μ μμ λ
Έλκ° λ μμ κ°μ΄λΌλ©΄ Swapν΄μ€λ€.
μμ λ
Έλλ λ κ°κ° μλ€. μ¬κΈ°μ μ΄λ€ μμ λ
Έλλ₯Ό μ νν΄μΌ ν κΉ?
μ§κΈμ μ΅μ νμ ꡬννλ κ³Όμ μ΄κΈ° λλ¬Έμ, λ μμ λ
Έλ μ€ λ μμ κ°μ κ°μ§λ λ
Έλλ₯Ό μλ‘ μ¬λ¦¬λ©΄ λλ€.
4. μμΉλ₯Ό μ°Ύμ λ κΉμ§ 3λ² κ³Όμ μ λ°λ³΅νλ€.
Min Heap μμ ꡬν
// delete
private 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;
}
μ 체 μ½λ
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
public class HeapEx {
static class MinHeap {
private ArrayList<Integer> heap;
/*heap init*/
public MinHeap(){
// μ΄κΈ° heap μμ±
heap = new ArrayList<>(Arrays.asList(0,2,3,5,4,7,6));
}
// insertion
private void insert(int data) {
heap.add(data);
int position = heap.size() - 1;
// λ£¨νΈ λ
ΈλκΉμ§ μ΄λνκ±°λ, λΆλͺ¨ Heapμ΄ μμ Heapλ³΄λ€ μμ λ κΉμ§
while(position > 1 && heap.get(position) < heap.get(position / 2)) {
/*λΆλͺ¨ λ
Έλμ μμ λ
Έλκ°μ swapμ μν μ°μ°*/
int temp = heap.get(position / 2);
heap.set(position / 2, heap.get(position));
heap.set(position, temp);
position /= 2;
}
System.out.println("min heap μ½μ
ν heap: " + heap);
}
// delete
private ArrayList delete() {
// heap μ¬μ΄μ¦κ° 1λ³΄λ€ μμΌλ©΄ μ¦, νμ κ°μ΄ μμΌλ©΄ return 0;
if(heap.size() - 1 < 1) {
return null;
}
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 heap;
}
}
public static void main(String[] args) throws IOException {
MinHeap mh = new MinHeap();
mh.insert(1);
System.out.println("min heap μμ ν heap: " + mh.delete());
}
}
λ€μμΌλ‘λ μ°μ μμ νμ λν΄ κ°λ΅ν μμλ³΄κ² λ€.
λμ κ°μ΄ λ¬Άμ΄μ μ 리ν μ΄μ λ μ°μ μμ νκ° ν μλ£κ΅¬μ‘°λ‘ ꡬνν μ μκΈ° λλ¬Έμ΄λ€.
μ°μ μμ ν(Priority Queue)λ?
ν(Queue)λ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° λ¨Όμ λκ°λ FIFO(First In First Out) νμμ μλ£κ΅¬μ‘°μ΄λ€.
μ°μ μμ ν(Priority Queue)λ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° μλλΌ, μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λκ°λ ννμ μλ£κ΅¬μ‘°μ΄λ€.
μ°μ μμ νλ μΌλ°μ μΌλ‘ ν(Heap)μ μ΄μ©νμ¬ κ΅¬ννλ€.
πμ°Έκ³ μ¬μ΄νΈ
μλ£κ΅¬μ‘°] ν κ°λ κ³Ό JAVAλ‘ κ΅¬ν
[μλ£ κ΅¬μ‘°] ν μλ£κ΅¬μ‘°μ μ΅μ νμ μ½μ , μμ μ°μ° ꡬν::
[μλ£κ΅¬μ‘° ν] μ΅μν, μ΅λν
[μλ£κ΅¬μ‘°] μ°μ μμ νμ ν (Priority Queue & Heap)
'Algorithm > KBro Study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] Brute Force(λΈλ£¨νΈ ν¬μ€) (0) | 2023.01.08 |
---|---|
[μλ£κ΅¬μ‘°] B-tree, B+tree μ΄λ‘ μ 리 (0) | 2022.12.28 |
[μλ£κ΅¬μ‘°] Java - ν΄μν μ΄λΈ(HashTable) μ΄λ‘ μ 리 (0) | 2022.12.23 |
[μλ£κ΅¬μ‘°]Java - Binary Search Tree(μ΄μ§ νμνΈλ¦¬) κ°λ + ꡬν (0) | 2022.12.06 |
[μλ£κ΅¬μ‘°] μλ° LinkedList(μ°κ²°λ¦¬μ€νΈ)? (0) | 2022.12.01 |