[C++] Heap
heap์ด๋
- ์์ ์ด์งํธ๋ฆฌ ๊ตฌ์กฐ์ ์๋ฃ๊ตฌ์กฐ๋ก, ์ผ์ชฝ ๋ถํฐ ์ฑ์๋๊ฐ๋ค.
- ์ต์๋จ ๋ฃจํธ๋ ธ๋๋ Minํ์ผ ๊ฒฝ์ฐ ์ต์๊ฐ, Maxํ์ผ ๊ฒฝ์ฐ ํญ์ ์ต๋๊ฐ์ ๊ฐ๋๋ค.
- ๋ถ๋ชจ๋ ธ๋๋ ์์๋ ธ๋๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
- ๋ณดํต ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค.
1. make_heap ์ผ๋ก ํ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
#include<algorithm>
์ด ํ์- make_heap์ vector๋ฅผ heap ์ฒ๋ผ ๋ณํํด์ฃผ๋ ๊ฒ์ด์ง, ์์ฒด๋ก๋ ์ปจํ ์ด๋๊ฐ ์๋!
- ํ์ผ๋ก ๋ณํํ ์ดํ์๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ ธ๋๊ฐ ๋งจ ์์ ์์น
std::make_heap
template< class RandomIt, class Compare >
constexpr void make_heap( RandomIt first, RandomIt last, Compare comp );
EX)
//default๋ max heap์ด๋ค
make_heap(v.begin(), v.end());
// min heap์ ์ํด์ ๋น๊ตํจ์๋ฅผ ์ง์ ํด์ผ ํ๋ค.
make_heap(v.begin(), v.end(), greater<>());
- first : ํ์ ๋ง๋ค ์์ ๋ฒ์๋ฅผ ์ง์ ํ๋ค.
- last : ํ์ ๋ง๋ค ์ข ๋ฃ ๋ฒ์๋ฅผ ์ง์ ํ๋ค.
- comp : ์ฐ์ ์์๋ฅผ ์ง์ ํ๊ธฐ ์ํ ๋น๊ตํจ์.
- ๋น๊ตํจ์๋
bool cmp(const Type1 &a, const Type2 &b);
ํํ๋ฅผ ๊ฐ๋๋ค. - ์ด๋ a๋ ๋ถ๋ชจ๋
ธ๋, b๋ ์์๋
ธ๋์ด๋ฉฐ, ์ฐ์ ์์๊ฐ ๋์ผ๋ ค๋ฉด
operator<
์์ false๋ฅผ ๋ฐํํด์ผ ํ๋ค!
- ๋น๊ตํจ์๋
- make_heap์
O(N)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
์ฝ์ . push_heap
push_back์ผ๋ก ๋ ธ๋ ์ฝ์ -> push_heap ์ผ๋ก ์ ๋ ฌ
push_heap์ ์ฐ์ ์์์ ๋ง๊ฒ ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ ๋ ฌ๋ง ํ๋ ํจ์๋ค. ์ฆ vector์ ๋ ธ๋๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ push_back ๋ฑ์ ์ด์ฉํด ๋ฐ๋ก ์ถ๊ฐํ ํ push_heap์ ์ฌ์ฉํด์ผ ํ๋ค!!
์ฝ์
์ ์๊ฐ๋ณต์ก๋๋ O(logN)
์ด๋ค
std:: push_heap
template< class RandomIt, class Compare >
constexpr void push_heap( RandomIt first, RandomIt last, Compare comp );
EX)
//make_heap์ ํ๋ ๋ฐฉ์๊ณผ ๋์ผํ๋ค!
push_heap(v.begin(), v.end());
push_heap(v.begin(), v.end(), greater<>());
์ญ์ . pop_heap
pop_heap์ผ๋ก ์ ๋ ฌ -> pop_back์ผ๋ก ๋ ธ๋ ์ ๊ฑฐ
pop_heap์ ๋ฃจํธ์ ์๋ ๋ ธ๋๋ฅผ ์ปจํ ์ด๋์ ๋งจ ๋ค๋ก ๋ณด๋ด๊ธฐ๋ง ํ๋ ํจ์๋ค. ์ฆ ๋งจ ๋ค๋ก ๋ณด๋ด์ง ์ต์ฐ์ ์์ ๋ ธ๋๋ฅผ vector์์ pop_back๋ฑ์ ์ด์ฉํด ๋ฐ๋ก ์ญ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ญ์ ์ ์๊ฐ๋ณต์ก๋๋ O(logN)
์ด๋ค
std:: pop_heap
template< class RandomIt, class Compare >
constexpr void pop_heap( RandomIt first, RandomIt last, Compare comp );
EX)
//make_heap์ ํ๋ ๋ฐฉ์๊ณผ ๋์ผํ๋ค!
pop_heap(v.begin(), v.end());
pop_heap(v.begin(), v.end(), greater<>());
2. ํ์ผ๋ก ๊ตฌํ๋ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๊ธฐ
#include <queue>
๊ฐ ํ์- ํ์ผ๋ก ๊ตฌํ์ด ๋์ด์๊ธฐ ๋๋ฌธ์ ํ์ผ๋ก ํ์ด์ผ ํ๋ ๋ฌธ์ ์์ ํธ๋ฆฌํ๋ค
- ์ง์ ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๊ฐ์ด Top์ ์์นํ๊ฒ ๋๋ค
template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class priority_queue;
EX)
//๊ธฐ๋ณธ์ ์ธ ์ฐ์ ์์ํ ์ ์ธ
priority_queue<int> q;
//๋ด๋ฆผ์ฐจ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ฐ์ ์์ํ ์ ์ธ
priority_queue<int, vector<int>, greater<int>> minq;
//์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ๋์์ ํ๋ ๋ฐฉ์. iterater๋ก ๋ฐ๋ก ๋ณต์ฌ ๊ฐ๋ฅ
priority_queue<int> q(v.begin(), v.end());
- T : ์ปจํ ์ด๋์ ๋ด์ ์๋ฃํ
- Container : vector<T>์ ๊ผด๋ก ์ ๋๋ค. ๋ด๋ถ์ ์ผ๋ก vector๋ก ๊ตฌํ๋๋๋ฏ
-
Compare : ์ฐ์ ์์๋ฅผ ์ง์ ํ ๋น๊ตํจ์, default๋ less์ฌ์ Max heap์ด๋ค
- T ์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ํตํด
operater<
๋ฅผ ์ ์ํ๋ค๋ฉด, ์ํ๋ ์ฐ์ ์์๋ฅผ ์ง์ ํด์ค ์ ์๋ค!!
Priority_Queue์ ์ฃผ์ ๋ฉ์๋
๋ฉค๋ฒ | ์ค๋ช |
---|---|
.top() | ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ ธ๋๋ฅผ ๋ฐํ |
.push() | ์ฐ์ ์์์ ๋ง๊ฒ ๋ ธ๋๋ฅผ ์ถ๊ฐ |
.pop() | ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ ธ๋๋ฅผ ์ ๊ฑฐ |
.empty() | ํ๊ฐ ๋น์ด์๋ค๋ฉด true, ์๋๋ผ๋ฉด false |
.size() | ํ์ ์กด์ฌํ๋ ์์์ ๊ฐฏ์ |
(ํฌ์คํธ๋ฒํธ: cpp_heap)