[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) 
