μ°μ μμ ν?
μ°μ μμ νλ μλ£κ΅¬μ‘° μ€ νλλ‘, λ°μ΄ν°λ₯Ό μ°μ μμμ λ°λΌ μ λ ¬νμ¬ κ΄λ¦¬νλ μλ£κ΅¬μ‘°μ λλ€.
μ°μ μμ νμ ꡬν λ°©λ²
μ°μ μμ νλ λ€μν λ°©λ²μΌλ‘ ꡬνλ μ μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ κ΅¬ν λ°©λ²μ λ°°μ΄μ μ΄μ©ν ꡬνκ³Ό νμ μ΄μ©ν ꡬνμ λλ€. λ°°μ΄μ μ΄μ©ν ꡬνμ κ°λ¨νμ§λ§, μ½μ μ΄λ μμ κ° μΌμ΄λ λλ§λ€ μ λ ¬ν΄μΌνλ―λ‘ μκ° λ³΅μ‘λκ° λμμ§λ λ¨μ μ΄ μμ΅λλ€. λ°λ©΄, νμ μ΄μ©ν ꡬνμ μ½μ κ³Ό μμ κ° κ°λ¨νλ©°, μκ° λ³΅μ‘λκ° O(log N)μΌλ‘ μ μ§λ©λλ€.
μ°μ μμ νμ ꡬ쑰
μ°μ μμ νλ λ³΄ν΅ ν(Heap) μλ£κ΅¬μ‘°λ₯Ό νμ©νμ¬ κ΅¬νλ©λλ€. νμ μ΄μ§νΈλ¦¬μ μΌμ’ μΌλ‘, μ΅λκ° λλ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμλ΄κΈ° μν΄ μ¬μ©λ©λλ€. νμ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λλ€.
- μμ μ΄μ§ νΈλ¦¬(Complete Binary Tree)μ΄λ€.
- λΆλͺ¨ λ Έλλ νμ μμ λ Έλλ³΄λ€ ν¬κ±°λ μλ€. (μ΅λ ν, μ΅μ ν)
- μ½μ μμλ νμ μΌμͺ½ μμλΆν° μ±μλκ°λ€.
λ°λΌμ μ°μ μμ νλ₯Ό ꡬνν λμλ νμ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ λ ¬ν©λλ€.
C++ STLμ priority queue
C++ STLμμλ μ°μ μμ νλ₯Ό ꡬνν priority_queue ν΄λμ€κ° μ 곡λ©λλ€. μ΄ ν΄λμ€λ μΌλ°μ μΌλ‘ νμ κΈ°λ°μΌλ‘ ꡬνλλ©°, μ°μ μμμ λ°λΌ λ°μ΄ν°λ₯Ό μλμΌλ‘ μ λ ¬ν΄μ€λλ€. μ°μ μμ νλ₯Ό μ¬μ©νκΈ° μν΄μλ <queue> ν€λ νμΌμ ν¬ν¨μμΌμΌ ν©λλ€.
μ μΈ λ° μ΄κΈ°ν
#include <queue>
using namespace std;
// μ°μ μμ ν μ μΈ
priority_queue<int> pq;
μμ κ°μ΄ μ μΈνλ©΄ pqλΌλ μ΄λ¦μ μ°μ μμ νκ° μμ±λ©λλ€. κΈ°λ³Έμ μΌλ‘ μ΄ ν΄λμ€λ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λ©λλ€. λ§μ½ μ€λ¦μ°¨μμΌλ‘ μ λ ¬νκ³ μΆλ€λ©΄, λ€μκ³Ό κ°μ΄ μμ±νλ©΄ λ©λλ€.
priority_queue<int, vector<int>, greater<int>> pq;
μ½μ κ³Ό μμ
μ°μ μμ νμ λ°μ΄ν°λ₯Ό μ½μ νκ³ μμ νλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
// λ°μ΄ν° μ½μ
pq.push(3);
pq.push(1);
pq.push(4);
// λ°μ΄ν° μμ
while(!pq.empty()){
cout << pq.top() << " ";
pq.pop();
}
μ μ½λλ push() ν¨μλ‘ μ°μ μμ νμ 3, 1, 4λ₯Ό μ½μ ν ν, top() ν¨μμ pop() ν¨μλ₯Ό μ¬μ©νμ¬ νμμ λ°μ΄ν°λ₯Ό μμ νλ©΄μ μΆλ ₯νλ μ½λμ λλ€. μ΄ μ½λλ₯Ό μ€ννλ©΄ 4 3 1 μμλ‘ μΆλ ₯λ©λλ€.
νμ© μμ
μ°μ μμ νλ₯Ό νμ©νμ¬ λ€μκ³Ό κ°μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
μ΅λ/μ΅μκ° κ΅¬νκΈ°
int arr[] = {3, 1, 4, 2, 5};
priority_queue<int> pq(arr, arr + 5);
cout << pq.top(); // 5
μ μ½λλ λ°°μ΄ arrμ μ΄μ©νμ¬ μ°μ μμ νλ₯Ό μμ±νκ³ , top() ν¨μλ₯Ό μ¬μ©νμ¬ μ΅λκ° 5λ₯Ό μΆλ ₯νλ μ½λμ λλ€.
Kλ²μ§Έλ‘ μμ μμ ꡬνκΈ°
int arr[] = {3, 1, 4, 2, 5};
priority_queue<int> pq;
int k = 3;
for(int i = 0; i < 5; i++){
pq.push(arr[i]);
if(pq.size() > k) pq.pop();
}
cout << pq.top(); // 3
μ μ½λλ λ°°μ΄ arrμ Kλ²μ§Έλ‘ μμ μμλ₯Ό ꡬνλ μ½λμ λλ€. push() ν¨μλ‘ λ°μ΄ν°λ₯Ό μ½μ νλ©΄μ, pop() ν¨μλ‘ νμ ν¬κΈ°λ₯Ό Kλ‘ μ μ§ν©λλ€. μ΄λ κ² νλ©΄ λ§μ§λ§μ λ¨λ μμκ° Kλ²μ§Έλ‘ μμ μμκ° λ©λλ€.
μ°μ μμ νμ λ©€λ² ν¨μ
priority_queue ν΄λμ€λ λ€μκ³Ό κ°μ λ©€λ² ν¨μλ₯Ό μ 곡ν©λλ€.
push() | μ°μ μμ νμ λ°μ΄ν°λ₯Ό μ½μ ν©λλ€. | O(log N) |
pop() | μ°μ μμ νμμ μ΅μμ λ°μ΄ν°λ₯Ό μμ ν©λλ€. | O(log N) |
top() | μ°μ μμ νμμ μ΅μμ λ°μ΄ν°λ₯Ό λ°νν©λλ€. | O(1) |
empty() | μ°μ μμ νκ° λΉμ΄μλμ§ μ¬λΆλ₯Ό λ°νν©λλ€. | O(1) |
size() | μ°μ μμ νμ ν¬κΈ°λ₯Ό λ°νν©λλ€. | O(1) |
priority_queue ν΄λμ€μ μκ° λ³΅μ‘λλ λμ²΄λ‘ O(log N)μ λλ€. λ°λΌμ νμ ν¬κΈ°κ° NμΈ κ²½μ°, μ½μ , μμ , μ΅μμ λ°μ΄ν° λ°ν λ±μ μ°μ°μ μμλλ μκ°μ λλ΅ log N μ λκ° λ©λλ€. priority_queueμ κ³΅κ° λ³΅μ‘λλ νμ ν¬κΈ°μ λΉλ‘ν©λλ€.