Heap(Max Heap, Min Heap) - accidentlywoo/legacyVue GitHub Wiki

Heap(Max Heap, Min Heap)


Heap ์ž๋ฃŒ๊ตฌ์กฐ

์ž๋ฃŒ๊ตฌ์กฐ์˜ ์ผ์ข…์œผ๋กœ Tree์˜ ํ˜•์‹์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, Tree ์ค‘์—์„œ๋„ ๋ฐฐ์—ด์— ๊ธฐ๋ฐ˜ํ•œ Complete Binary Tree์ด๋‹ค. ๋ฐฐ์—ด์— ํŠธ๋ฆฌ์˜ ๊ฐ’๋“ค์„ ๋„ฃ์–ด์ค„ ๋•Œ, 0๋ฒˆ์งธ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  1๋ถ€ํ„ฐ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค. ์ด๋Š” ๋…ธ๋“œ์˜ ๊ณ ์œ ๋ฒˆํ˜ธ ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ index๋ฅผ ์ผ์น˜์‹œ์ผœ ํ˜ผ๋™์„ ์ค„์ด๊ธฐ ์œ„ํ•จ์ด๋‹ค. ํž™์—๋Š” ์ตœ์†Œํž™(min heap), ์ตœ๋Œ€ํž™(max heap) ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. Max Heap์ด๋ž€, ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์ด children์˜ ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ complete binary tree๋ฅผ ๋งํ•œ๋‹ค. (min heap์€ ๊ทธ ๋ฐ˜๋Œ€์ด๋‹ค.)

Max heap์—์„œ๋Š” Root node์— ์žˆ๋Š” ๊ฐ’์ด ์ œ์ผ ํฌ๋ฏ€๋กœ, ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์—ฐ์‚ฐ์˜ time complexity์ด O(1)์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  complete binary tree์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.(์ฆ‰, random access๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. Min heap์—์„œ๋Š” ์ตœ์†Œ๊ฐ’์„ ์ฐพ๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์—ฐ์‚ฐ์˜ time complexity๊ฐ€ O(1)์ด๋‹ค.)

๋ฐฐ์—ด์— ์ €์žฅํ•˜์˜€์„ ๋•Œ์˜ ์žฅ์ ์„ ์‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค ๊ฐ’์„ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ? complete binary tree๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ n๊ฐœ ์ผ ๋•Œ, i๋ฒˆ์งธ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ parent(i) = i/2, left_child(i) = 2i, right_child(i) = 2i+1์˜ index๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

Heapify

๋‘ ๊ฐœ์˜ subtree๊ฐ€ max-heap์ผ ๋•Œ root๋ฅผ ํฌํ•จํ•œ ์ „์ฒด๊ฐ€ heap์ด ๋˜๋„๋ก ์œ„์น˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. ๋ฃจํŠธ์—์„œ ์ž‘์€ ๊ฐ’์ด ํ˜๋Ÿฌ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹(float-down)์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค. Max heapify์˜ ๊ฒฝ์šฐ, root๊ฐ€ child๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋‘ ๊ฐœ์˜ child ์ค‘ ๊ฐ’์ด ํฐ ๋…ธ๋“œ์™€ root๋ฅผ ๊ต์ฑ„ํ•  ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ (์ฒ˜์Œ์— root์˜€๋˜ ๋…ธ๋“œ๊ฐ€ leaf node๋กœ ๋  ๋•Œ๊นŒ์ง€) ๋ฐ˜๋ณตํ•ด์ค€๋‹ค.

์ตœ๋Œ€๊ฐ’ ์ถ”์ถœ

์ตœ๋Œ€๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค. ๋˜๋Š” ์ตœ์†Œ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿด ๋•Œ,heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฐ€? Max Heap์—์„œ ์ตœ๋Œ€๊ฐ’์€ ๋ฃจํŠธ ๋…ธ๋“œ์ด๋‹ค. ์ตœ๋Œ€๊ฐ’์„ ์ถ”์ถœํ•˜๋Š”๋ฐ <Big-O(1)>์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ์‚ฌ๋ผ์ง„ ๋‹ค์Œ์—๋„ ํŠธ๋ฆฌ๋Š” Max Heap์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, heapify๋ฅผ ํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜์—ฌ heap์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ root์— ์˜ฎ๊ธฐ๊ณ  heapify๋ฅผ ํ•ด์ค€๋‹ค. ์ด ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ root์— ์ถ”๊ฐ€ํ•˜์—ฌ heapify ํ•˜๋Š” ๊ณผ์ •์€ <Big-O(log n)>์ด ๋œ๋‹ค.

์ƒˆ๋กœ์šด ๊ฐ’ ์‚ฝ์ž…

heap์— ์ƒˆ๋กœ์šด ๊ฐ’์ด ์‚ฝ์ž…๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค ์กฐ์น˜๋ฅผ ์ทจํ•ด์ค˜์•ผ heap์˜ ํ˜•ํƒœ๊ฐ€ ์œ ์ง€๋  ์ˆ˜ ์žˆ์„๊นŒ?(Max heap์˜ ๊ฒฝ์šฐ) ์ผ๋‹จ ์ƒˆ๋กœ ๋“ค์–ด์˜จ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ œ์ผ ์ž‘๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…์„ ํ•œ ๋’ค, ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜๋ฉด์„œ, ์—ญ heapify๋ฅผ ํ•ด์ค€๋‹ค.์‚ฝ์ž…๋œ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๊ทธ ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด, ๋ถ€๋ชจ ๋…ธ๋“œ์™€ swap์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๊ณ ,๋” ์ž‘๋‹ค๋ฉด, ๊ทธ ์ƒํƒœ๋กœ max heap ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์„ฑ์งˆ์„ ๋งŒ์กฑํ•˜๋ฏ€์˜ค ๋น„๊ต๋ฅผ ๋ฉˆ์ถ˜๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฝ์ž…์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ