- λ€μ΄κ° μμμ μκ΄μμ΄ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λμ€λ μλ£κ΅¬μ‘°
- queueμ μ°μ μμ κ°λ μ λμ ν μλ£κ΅¬μ‘°
- μ°μ μμ νλ Array, LinkedList, HeapμΌλ‘ ꡬν κ°λ₯ β HeapμΌλ‘ ꡬννλκ² κ°μ₯ ν¨μ¨μ
- Array
- μ°μ μμκ° λμ μμλλ‘ λ°°μ΄μ κ°μ₯ μλΆλΆλΆν° μ½μ
β
O(1)
- μ°μ μμκ° μ€κ°μΈ λ°μ΄ν°λ₯Ό μ½μ
νλ κ³Όμ μμ μμΉλ₯Ό νμνκ³ νμΉΈμ© λ€λ‘ λ°μ΄μΌν¨ β
O(N)
- μ°μ μμκ° λμ μμλλ‘ λ°°μ΄μ κ°μ₯ μλΆλΆλΆν° μ½μ
β
- LinkedList
- μ°μ μμκ° λμ λ°μ΄ν°λ₯Ό headμ μμΉνλλ‘ μ½μ
β
O(1)
- μ°μ μμκ° μ€κ°μΈ λ°μ΄ν°λ₯Ό μ½μ
νλ κ³Όμ μμ μμΉλ₯Ό νμν΄μΌ ν¨ β
O(N)
- μ°μ μμκ° λμ λ°μ΄ν°λ₯Ό headμ μμΉνλλ‘ μ½μ
β
- Heap
- λ°μ΄ν° μ½μ
, μμ λͺ¨λ β
O(log2N)
- λ°μ΄ν° μ½μ
, μμ λͺ¨λ β
- Array
- νμ μμ μ΄μ§ νΈλ¦¬μ μΌμ’
μ΄λ€.
- μμ μ΄μ§ νΈλ¦¬λ μ€λ³΅μ νμ©νμ§ μμ, νμ μ€λ³΅μ νμ©ν¨
- λͺ¨λ λ
Έλμ μ°μ μμ(λ
Έλμ κ°)μ μμ λ
Έλμ μ°μ μμλ³΄λ€ ν¬κ±°λ κ°λ€
- μ°μ μμμ λμκ΄κ³λ λΆλͺ¨-μμ κ°μλ§ μ±λ¦½λ¨. νμ κ°μλ μ±λ¦½λμ§ μμ
- νμ μ’
λ₯ : μ΅λ ν, μ΅μ ν
- μ΅λ ν : λ Έλμ κ°μ΄ ν΄μλ‘ μ°μ μμκ° λλ€, 루νΈλ Έλμ κ°μ΄ κ°μ₯ ν¬λ€
- μ΅μ ν : λ Έλμ κ°μ΄ μμμλ‘ μ°μ μμκ° λλ€, 루νΈλ Έλμ κ°μ΄ κ°μ₯ μλ€
- νμ μμ κ³Όμ
- λ£¨νΈ λ Έλλ₯Ό μμ
- λ§μ§λ§ λ Έλλ₯Ό λ£¨νΈ λ Έλλ‘ μ΄λ
- Heapify μμ (λΆλͺ¨λ Έλμ μμλ Έλ μ€ ν° λ Έλμ λμ λΉκ΅)
- νμ μ½μ
κ³Όμ
- λ§μ§λ§ λ Έλμ μ½μ
- Heapify μμ (λΆλͺ¨λ Έλμ μμλ Έλμ λμ λΉκ΅)
- ν μλ£κ΅¬μ‘°λ λ체μ μΌλ‘ λ°°μ΄λ‘ ꡬνλλ€.
- μμ μ΄μ§ νΈλ¦¬λ₯Ό κΈ°λ³ΈμΌλ‘ νκΈ° λλ¬Έμ λΉ κ³΅κ°μ΄ μμ΄ λ°°μ΄λ‘ ꡬννκΈ° μ©μ΄ν¨
- λ
Έλ λ²νΈκ° iμΈ κ²½μ°
- λΆλͺ¨ λ
Έλ :
arr[i // 2]
- μΌμͺ½ μμ λ
Έλ :
arr[2 * i]
- μ€λ₯Έμͺ½ μμ λ
Έλ :
arr[2 * i + 1]
- λΆλͺ¨ λ
Έλ :
μ΅μ ν ꡬν
public class minHeap{
private ArrayList<Integer> heap;
//μ΅μν μμ±μ
public minHeap() {
heap = new ArrayList<Integer>();
heap.add(0); // 0λ²μ§Έ μΈλ±μ€λ μ¬μ© μν©
}
//μ½μ
public void insert(int val) {
heap.add(val);
int p = heap.size()-1; //pλ μλ‘ μ½μ
ν λ
Έλμ μΈλ±μ€ μ 보
while(p>1 && heap.get(p/2)>heap.get(p)) {
//μλ‘ μ½μ
ν λ
Έλμ μμΉκ° 1 μ΄κ³Όμ΄κ³ λΆλͺ¨κ° μμλ³΄λ€ ν¬λ©΄ μ§ν ->μλ‘ μ½μ
ν λ
Έλμ μμΉκ° 루νΈκΉμ§ κ°κ±°λ μλ‘ μ½μ
ν λ
Έλκ° λΆλͺ¨λ³΄λ€ ν΄λκΉμ§ μ§ν
int tmp = heap.get(p/2);//λΆλͺ¨ λ
Έλμ κ°
heap.set(p/2, val);
heap.set(p, tmp);
p /= 2; //μλ‘ μ½μ
ν λ
Έλκ° ν λ 벨 μμΉνμΌλ μΈλ±μ€ λΆλͺ¨ λ
Έλ μΈλ±μ€ κ°μΌλ‘ λ³κ²½
}
}
//μμ
public int delete() {
//ν μ΄ λΉμ΄μμΌλ©΄ 0리ν΄
if(heap.size()-1 < 1) {
return 0;
}
//μμ ν λ
Έλ, λ£¨νΈ λ
Έλ
int deleteitem = heap.get(1);
//λ§μ§λ§ λ
Έλλ₯Όrootμ μ½μ
νκ³ λ§μ§λ§ λ
Έλ μμ
heap.set(1,heap.get(heap.size()-1));
heap.remove(heap.size()-1);
int pos = 1; //루νΈμ μλ‘ μ½μ
ν λ
Έλμ μΈλ±μ€ μ 보
//pos*2λ μΌμͺ½μμμ μΈλ±μ€ κ°, μμμ μΈλ±μ€ κ°μ΄ νμ μ¬μ΄μ¦ κ°λ³΄λ€ ν¬λ€λκ²μ λμ΄μ μ½μ
ν μμΉλ₯Ό λ²μ΄λ¬λ€λλ»
while((pos*2)<heap.size()) {
int min = heap.get(pos*2);//μΌμͺ½ μμμ κ°
int minPos = pos*2;// μΌμͺ½ μμμ μΈλ±μ€ κ°
//μ€λ₯Έμͺ½ μμμ μΈλ±μ€κ° μ¬μ΄μ¦λ³΄λ€ μκ³ μΌμͺ½ λ³΄λ€ λ μμλ μ€λ₯Έμͺ½ μμμ λΆλͺ¨μ λ°κΏμ€ μμμΌλ‘ μ§μ
if(((pos*2+1)<heap.size()) && min > heap.get(pos*2+1)) {
min = heap.get(pos*2 +1);
minPos = pos*2 +1;
}
//λΆλͺ¨κ° λ μμΌλ©΄ κ·Έλ§
if(min > heap.get(pos))
break;
//λΆλͺ¨ μμ κ΅ν
int tmp = heap.get(pos);
heap.set(pos,heap.get(minPos));
heap.set(minPos, tmp);
pos = minPos;
}
return deleteitem;
}
}