μ°μ μμ ν(Priority Queue)
: κ°μ₯ λμ μ°μ μμλ₯Ό κ°μ§ νλͺ©μ μ κ·Όκ³Ό μμ , μμμ μ°μ μμλ₯Ό κ°μ§ νλͺ© μ½μ μ μ§μνλ μλ£κ΅¬μ‘°μ΄λ€.
ν(Queue)λΌκ³ ν¨μ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° λ¨Όμ λκ°λ μλ£κ΅¬μ‘°μΈλ°,
μμ μ°μ μμκ° λΆμ΄μ λ¨Όμ λ€μ΄μ€λ λ°μ΄ν°κ° μλ μ°μ μμκ° λμ λ°μ΄ν°κ° λ¨Όμ λκ°λ ꡬ쑰μΈκ²μ΄λ€.
ν(Heap)μ΄λ μ°μ μμ νλ₯Ό μν΄μ κ³ μλ μμ μ΄μ§νΈλ¦¬ ννμ μλ£κ΅¬μ‘°μ΄λ€.
λν λΆλͺ¨μ μ°μ μμκ° μμμ μ°μ μμ λ³΄λ€ ν¬λ€λ νΉμ§μ κ°μ§κ³ μμ΄ μ°μ μμ νλ₯Ό ꡬννλλ° νμ μ£Όλ‘ μ¬μ©νλ€.
νμ μ’ λ₯λ λκ°μ§κ° μλ€.
- μ΅μ ν(Minimum Heap) : ν€κ° μμμλ‘ λμ μ°μ μμ
Key(λΆλͺ¨λ Έλ) < Key(μμ λ Έλ)
- μ΅λ ν(Maximum Heap) : ν€κ° ν΄ μλ‘ λ λμ μ°μ μμ
Key(λΆλͺ¨λ Έλ) > Key(μμ λ Έλ)
νμ μμ μ΄μ§νΈλ¦¬μ ννλΌκ³ νλ€.
ꡬ쑰λ₯Ό νλ² μ§μ΄λ³΄μ.
- a[i]μ μμ
- a[2xi]μ a[2xi + 1]
- a[j]μ λΆλͺ¨
- a[j/2] λ¨, j>1μ΄κ³ , j/2μ μ μλ§
μ΅μ ν - μ΅μκ° μ κ·Ό
- μ΅μ νμ 루νΈμλ νμ κ°μ₯ μμ(min) ν€κ° μλ€.
- λΆλͺ¨μ μ μ₯λ ν€κ° μμμ ν€λ³΄λ€ μλ€λ κ·μΉ λλ¬Έμ΄λ€.
- 루νΈλ a[1]μ μμΌλ―λ‘, O(1) μκ°μ min ν€λ₯Ό κ°μ§ λ Έλμ μ κ·Όν μ μλ€.
μ΅μ ν - μ΅μκ° μμ
루νΈμ ν€λ₯Ό μμ νλ€.
κ·Έλ¬λ©΄ 루νΈμ λ Έλκ° λΉκ²λλλ°.. κ·Έλμ μλ‘μ΄ λ Έλλ₯Ό ν λΉμμΌμΌ νλ€.
μμ κ³Όμ μ λ€μ μΈκ°μ§ μμλ₯Ό λ°λ₯Έλ€.
1. νμ κ°μ₯ λ§μ§λ§ λ Έλ, μ¦ λ°°μ΄μ κ°μ₯ λ§μ§λ§ νλͺ©μ 루νΈλ‘ μ΄λμν¨λ€.
μ΄λ κ² ν΄μΌ λΆλͺ¨ μμ κ΄κ³κ° κΌ¬μ΄μ§ μμμ κ·Έλ°λ― νλ€.
2. ν ν¬κΈ°λ₯Ό 1 κ°μμν¨λ€.
3. 루νΈλ‘λΆν° μμ μ€μμ μμ κ°μ κ°μ§ μμκ³Ό ν€λ₯Ό λΉκ΅νμ¬ ν μμ±μ΄ λ§μ‘±λ λκΉμ§ ν€λ₯Ό κ΅ννλ©° μ΄ν리 λ°©ν₯μΌλ‘ μ§ννλ€.
μ¦, λΉκ΅νμμ λ μμ κ°μ΄ μΉμκ° λλ―λ‘ μμ κ°μ μλ‘ μ¬λ €λ³΄λ΄μ£Όμ΄μΌ νλ€.
μΈ λ²μ§Έ κ³Όμ μΈ μλ‘ λΉκ΅νλ©° μμ κ°μ μ μΌ μλ‘ μ¬λ €μ£Όλ κ²μ downheap()μ΄λΌκ³ νλ€.
downheapμ λν ν¨μλ₯Ό μλ°λ‘ μ΄ν΄λ³΄μ.
private void downheap(int i) {
while(2*i <= N) {
// kλ iμ μΌμͺ½ μμμ΄λ€.
int k = 2*i;
// λ§μ½ μΌμͺ½ μμμ κ°μ΄ μ€λ₯Έμͺ½ λ³΄λ€ ν¬λ€λ©΄ iμ μ€λ₯Έμͺ½ μμ κ°μΌλ‘ kλ₯Ό λ°κΎΈμ΄ μ€λ€.
// μ¦, iμ μμ λ μ€ μμ λμ μ λ³νλ κ²
if (k < N && a[k] > a[k+1]) k++;
// λΆλͺ¨ λ
Έλμ κ°μ΄ μμ λ³΄λ€ μλ€λ©΄ μ΅μ νμ 쑰건μ λ§μ‘±
// μ’
λ£
if ( a[i] <= a[k] ) break;
// κ·Έκ² μλλΌλ©΄ μμκ³Ό λΆλͺ¨λ₯Ό λ°κΎΈμ΄ μ€λ€.
swap(i, k);
// κ·Έλ¦¬κ³ μμμ λΆλͺ¨λ‘ μ΄κΈ°ν
i = k;
}
}
κ·Έλ¦Όκ³Ό ν¨κ» μ½λλ₯Ό μ²μ²ν μ΄ν΄λ³΄κΈ°λ₯Ό λ°λλ€.
μ μ½λλ₯Ό ν΅ν΄ μ΅μκ°μ μμ νλ λ©μλ deleteMin λ©μλλ₯Ό μμ±ν μ μλ€.
public Entry deleteMin() {
// min κ°μ μ΄κΈ°ν
Entry min = a[1];
// λ°°μ΄ λ§¨ λ§μ§λ§ κ°κ³Ό μ΅μ κ°μ κ΅ν
swap(1, N--);
// μμ λ μ€μ λ‘ λ§¨ λ§μ§λ§ λ°°μ΄ κ°μμ μ΄λ£¨μ΄μ§
a[N+1] = null;
// downheapλ©μλλ₯Ό 1λ²μ§Έ μΈλ±μ€λ‘λΆν° μμ;
downheap(1);
// minκ° λ¦¬ν΄
return min;
}
μ΅μν - μ½μ μ°μ°(insert)
μ½μ μ°μ°μ λκ°μ§ κ³Όμ μ λ°λ₯Έλ€.
1. νμ λ§μ§λ§ λ Έλ(μ¦, λ°°μ΄μ λ§μ§λ§ νλͺ©)μ λ°λ‘ λ€μ empty μμμ μλ‘μ΄ νλͺ©μ μ μ₯νλ€.
2. λ£¨νΈ λ°©ν₯μΌλ‘ μ¬λΌκ°λ©΄μ λΆλͺ¨μ ν€μ λΉκ΅νμ¬ ν μμ±μ΄ λ§μ‘±λ λκΉμ§ λ Έλλ₯Ό κ΅ννλ€.
2λ²μ κ³Όμ μ΄ κΈ°μ‘΄μ μμ μ°μ° μ downheapκ³Ό λ€λ₯΄κ² μ΄ν리λ‘λΆν° μ¬λΌκ°λ©° μ§νλκΈ°μ upheapμ΄λΌκ³ λΆλ₯Έλ€.
deleteλ³΄λ¨ μ½λ€. μ½μ μ°μ°μ λ©μλλ νλ² μ΄ν΄λ³΄μ.
private void upheap(int j) {
// jκ° 1λ³΄λ€ ν¬λ€λ κ²μ λ£¨νΈ λ
Έλκ° μλλΌλ κ²
// j/2λ jμ λΆλͺ¨λ₯Ό λ»νλ€.
// μ¦, λΆλͺ¨κ° μμλ³΄λ€ ν° κ²½μ°λ₯Ό λ»νλ€.(μ΄ κ²½μ° swap νμ)
while(j > 1 && a[j/2] > a[j]) {
// λΆλͺ¨μ μμ swap
swap(j/2, j);
// μμμ λΆλͺ¨λ‘ μ΄κΈ°ν
j = j/2;
}
}
upheapλ©μλλ₯Ό ν΅ν΄ insert λ©μλλ₯Ό ꡬννλ©΄ λ€μκ³Ό κ°λ€.
a[++N] = temp;
upheap(N);
λ¨μν λ°°μ΄ ν¬κΈ°λ₯Ό νλλλ € μ μ₯ν΄μ£Όκ³ , upheapμ νΈμΆνκΈ°λ§ νλ©΄ κ°λ¨νκ² μ½μ μ ν μ μλ€.
μ΅λ νμ μ¬κΈ°μ λΆλ±νΈλ§ κ³ μΉλ©΄ κΈλ°© μμ±ν μ μλ€.
μν₯μ νμ΄λ
μ§κΈκΉμ§ μ°λ¦¬λ λ§λ€μ΄μ§ νμ λν΄μ μ½μ νκ³ μμ νλ κ³Όμ μ μ΄ν΄λ³΄μλ€.
κ·Έλ λ€λ©΄ νμ μ΄λ€ λ°©μμΌλ‘ μμ±λλ μ§ μμλ³Ό νμκ° μλ€.
μ΄λ ν¬κ² 2κ°μ§ λ°©λ²μΌλ‘ λλλ€. 첫 λ²μ§Έλ μ½μ μ λ°©μ, λ λ²μ§Έλ μν₯μ λ°©μμ΄λ€.
μ½μ μ λ°©μμ ν€κ° 미리 μ£Όμ΄μ Έ μλ , νλμ© μ£Όμ΄μ§λ μκ΄ μμ΄ μμ±μ΄ κ°λ₯νλ,
μν₯μ λ°©μμ 미리 ν€κ° μ£Όμ΄μ Έ μμ΄μΌ νλ€.(μ¦, 미리 ν€ λ°°μ΄μ΄ μμ΄μΌ νλ€.)
μ무νΌ, λ λ°©μ λͺ¨λ λλ€μΌλ‘ μμ¬μ Έ μλ ν€ λ°°μ΄μ΄ μλ€λ κ²μ΄λ€.
- μν₯μ λ°©μμΌλ‘ κ° λ Έλμ λν΄ ν μμ±μ λ§μ‘±νλλ‘ λΆλͺ¨μ μμμ μλ‘ κ΅ννλ€.
- nκ°μ νλͺ©μ΄ λ°°μ΄μ μμμ μμλ‘ μ μ₯λμ΄ μμ λ, νμ λ§λ€κΈ° μν΄μ , a[n/2]λΆν° a[1]κΉμ§ μ°¨λ‘λ‘ downheapμ κ°κ° μννμ¬ ν μμ±μ μΆ©μ‘±μν¨λ€.
μ κ·Έλ¦Όμ μν₯μ νμ λ§λλ μμμ΄λ€.
μν₯μ νμ λ§λ€κΈ° μν΄μλ downheapμ μ¬λ¬μ°¨λ‘ μνν΄μΌ νλ€κ³ νλ€. μ½λλ‘ νλ² μ΄ν΄λ³΄μ.
public void createHeap() {
for(int i= N/2; i>0; i--) {
downheap(i);
}
}
μν μκ° λΆμ
μν₯μ ν μμ±μ μνμκ°μ downheapμ λν μν μκ°κ³Ό κ° μΈ΅λ§λ€μ λ Έλμ μλ₯Ό κ³μ°νλ©΄λλ€. : O(n)μκ° μμ
Insert μ°μ°μ μν upheapμ μ½μ λ λ Έλλ ν€ κ°μ΄ κ°μλ λ Έλλ‘ λΆν° μ΅λ 루νΈκΉμ§ μ¬λΌκ°λ©° λΆλͺ¨μ μμ λ Έλλ₯Ό κ΅ννλ€.
delete_min μ°μ°μμλ νμ λ§μ§λ§ λ Έλλ₯Ό 루νΈλ‘ μ΄λν ν, downheapμ μ΅μμ μΈ΅μ λ ΈλκΉμ§ κ΅νν΄μΌ νλ κ²½μ°κ° λ°μνλ€.
μ¦, λ κ²½μ° λͺ¨λ μΈ΅μ λ°λΌμ μνμκ°μ΄ κ²°μ λλ€λ κ²μ΄λ€.
κ·Έλ κΈ°μ μν μκ°μ νμ λμ΄μ λΉλ‘νλ€.
νμ μμ μ΄μ§ νΈλ¦¬μ΄λ―λ‘ νμ nκ°μ λ Έλκ° μμΌλ©΄ κ·Έ λμ΄λ log(n+1) (μ΄λ, μμλ μ¬λ¦Ό)μ΄λ€.
μ¦, νμ λμ΄μ λΉλ‘νλ νμ κ° μ°μ° μν μκ°μ O(logn)μ΄λ€
References