heap์ด๋ž€

first

  • ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์™ผ์ชฝ ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.
  • ์ตœ์ƒ๋‹จ ๋ฃจํŠธ๋…ธ๋“œ๋Š” 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)

TOP

Tags:

Categories:

Updated: