* Heap(ํ)
: ์ต๋๊ฐ/์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ๊ธฐ ์ํด ๊ณ ์๋ ์์ ์ด์ง ํธ๋ฆฌ(Complete Binary Tree) ํํ์ ์๋ฃ๊ตฌ์กฐ
(์์ ์ด์ง ํธ๋ฆฌ: ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์ node๊ฐ ์์ ํ ์ฑ์์ ธ ์๊ณ , ๋ง์ง๋ง ๋ ๋ฒจ์ node๋ค์ ๊ฐ๋ฅํ ํ ์ผ์ชฝ๋ถํฐ ์ฑ์์ ธ ์๋ ๊ตฌ์กฐ)
: ์ฝ์ /์ญ์ /์ต๋๊ฐ ์ฐพ๊ธฐ/์ต์๊ฐ ์ฐพ๊ธฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ณต์ก๋ O(logN)
: root๊ฐ ์ต๋ ๊ฐ์ ๊ฐ๋ ์ต๋ ํ(Max Heap)๊ณผ root๊ฐ ์ต์ ๊ฐ์ ๊ฐ๋ ์ต์ ํ(Min Heap)์ด ์์
: ๊ฐ์ด '์ผ์ชฝ ์์ < ๋ถ๋ชจ < ์ค๋ฅธ์ชฝ ์์' ์์ผ๋ก ํฌ๊ธฐ๊ฐ ํฐ ์ด์ง ํ์ ํธ๋ฆฌ(Binary Search Tree)์ ๋ฌ๋ฆฌ '์์ < ๋ถ๋ชจ' ํํ์ ๊ฐ ํฌ๊ธฐ๋ง ์ ์ง๋จ.
: Heap ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์ฉํ ๋ํ์ ์ธ ์) Priority queue(์ฐ์ ์์ ํ)
* priority queue(์ฐ์ ์์ ํ)
: priority_queue<์๋ฃํ, ๊ตฌํ์ฒด, ๋น๊ต์ฐ์ฐ์> ๋ก ์ ์
1) ์๋ฃํ์ int, double ๋ฑ์ผ๋ก ์ง์ ๊ฐ๋ฅ
2) ๊ตฌํ์ฒด์ ๊ธฐ๋ณธ์ vector<์๋ฃํ> ์ผ๋ก ์ ์๋๋ค.
3) ๋น๊ต ์ฐ์ฐ์์ default๊ฐ์ less<์๋ฃํ>์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ด๊ณ , greater<์๋ฃํ>์ ๋ฃ์ด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ก ๋ง๋ค ์ ์๋ค.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
//์ฐ์ ์์ ํ ๋ด๋ฆผ์ฐจ์
priority_queue<int> pq_less;
pq_less.push(1);
pq_less.push(5);
pq_less.push(3);
int pq_less_size = pq_less.size();
for(int i=0; i<pq_less_size; i++){
cout << pq_less.top() << " "; // 5 3 1
pq_less.pop();
}cout << "\n";
//์ฐ์ ์์ ํ ์ค๋ฆ์ฐจ์
priority_queue<int, vector<int>, greater<int>> pq_greater;
pq_greater.push(1);
pq_greater.push(5);
pq_greater.push(3);
int pq_greater_size = pq_greater.size();
for(int i=0; i<pq_greater_size; i++){
cout << pq_greater.top() << " "; // 1 3 5
pq_greater.pop();
}
return 0;
}
: pair์ ํจ๊ป ์ฌ์ฉํ๋ฉด, ์ธ์๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ ์ ๋ ฌ๋ ํ๋ฒ์ ๊ตฌํ ๊ฐ๋ฅํ๋ค. pair์ first๋ฅผ ๋จผ์ ๋น๊ตํ๊ณ first๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ second ๊ฐ์ ๋น๊ตํ์ฌ ์ ๋ ฌ ๋ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค.
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<pair<int, int>> pq;
pq.push(make_pair(10, 100));
pq.push(make_pair(1, 50));
pq.push(make_pair(1, 200));
pq.push(make_pair(50, 50));
pq.push(make_pair(-10, 200));
int pq_size = pq.size();
for(int i = 0; i < pq_size; i++){
cout << pq.top().first << " " << pq.top().second << "\n";
}
return 0;
}
[C++ official reference ์ฐธ์กฐ]
cf) stack, queue, deque
*stack: ์ ์ ์ ์ถ๊ตฌ์กฐ๋ก ๋ค๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ์๋ฃ๊ตฌ์กฐ
: push(), pop(), top(), empty(), size() ๋ฑ์ ํจ์ ์ฌ์ฉ
#include <stack>
int main(){
stack<int> stk;
stk.push(1); // 1
stk.push(2); // 1 2
stk.push(3); // 1 2 3
stk.pop(); // 2 3
stk.top(); // 2
return 0;
}
* queue: ํ์ ์ ์ถ๊ตฌ์กฐ๋ก ๋ค๋ก ๋ฐ์ดํฐ์ ์ถ๊ฐ/์ญ์ ๊ฐ ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ
: push(), pop(), front(), back(), empty(), size() ๋ฑ์ ํจ์ ์ฌ์ฉ
#include <queue>
int main(){
queue<int> q;
q.push(1); // 1
q.push(2); // 1 2
q.push(3); // 1 2 3
q.pop(); // 1 2
q.front(); // 1
q.back(); // 2
return 0;
}
* deque: ๋ค๋ก๋ง ์ถ๊ฐ/์ญ์ ๊ฐ ๊ฐ๋ฅํ queue, vector์ ๋ฌ๋ฆฌ, ์/๋ค๋ก ์ถ๊ฐ/์ญ์ ๊ฐ ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ.
: push_back(), push_front(), pop_back(), pop_front(), front(), back(), empty(), size(), clear() ๋ฑ์ ํจ์ ์ฌ์ฉ
#include <deque>
int main(){
deque<int> dq;
deque<int> dq2(10); // defualt(0) ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ 10๊ฐ์ ์์๋ฅผ ๊ฐ์ง deque ์์ฑ
deque<int> dq3(10, 1); // 1๋ก ์ด๊ธฐํ๋ 10๊ฐ์ ์์๋ฅผ ๊ฐ์ง deque ์์ฑ
deque<int> dq4(dq3); // dq3์ ๋ณต์ฌํ dq4 ์์ฑ
dq.push_back(1); // 1
dq.push_back(2); // 1 2
dq.push_back(3); // 1 2 3
dq.push_front(0); // 0 1 2 3
dq.pop_back(); // 0 1 2
dq.pop_front(); // 1 2
dq.front(); // 1
dq.back(); // 2
return 0;
}
'๐ Coding Test Study > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] 1์ฐจ์, 2์ฐจ์ ๋ฐฐ์ด ๋์ ํ ๋น ๋ฐ ํด์ (0) | 2022.03.06 |
---|---|
[C++] Hash ์๋ฃ๊ตฌ์กฐ / unordered_map ์ฌ์ฉ๋ฒ(feat. map) (0) | 2021.10.31 |
[C++] ์ ์ /๋์ ํ ๋น๋ ๋ฐฐ์ด์ ํฌ๊ธฐ ๊ตฌํ๊ธฐ (0) | 2021.09.20 |
[C++] ํด์๋งต(Hash Map)์ ๋ํด ์์๋ณด์ (std::unordered_map) (0) | 2021.08.27 |
[C++][์ ๊ทํํ์] <regex> ํจ์ (0) | 2021.08.22 |