๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–‹๏ธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜,์ž๋ฃŒ๊ตฌ์กฐ

[ํž™] ์šฐ์„ ์ˆœ์œ„ ํ : ํž™

by OR15A 2023. 11. 21.

ํž™ (Heap)

  • ๋Œ€ํ‘œ์ ์ธ ์šฐ์„ ์ˆœ์œ„ ํ
  • ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ ์‚ฌ์šฉ
  • ํž™์—์„œ๋Š” ๋ชจ๋“  ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜(์ตœ๋Œ€ ํž™) ํ˜น์€ ์ž‘์Œ(์ตœ์†Œ ํž™)
  • ์›์†Œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ ํ•„์š”์—†๊ณ , ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋จ
  • ์‚ฌ์šฉ ์˜ˆ์‹œ : ์šด์˜ ์ฒด์ œ์—์„œ ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ค„๋ง, ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์Šคํ…œ ๋“ฑ
  • ํž™๊ณผ ์ด์ง„ ํŠธ๋ฆฌ๋Š” ๋ชจ๋‘ ๊ณ„์ธต์  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ์ž๋ฃŒ๊ตฌ์กฐ
  • ํž™์€ ์ฃผ๋กœ ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—, ์ด์ง„ ํŠธ๋ฆฌ(ํŠนํžˆ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ)๋Š” ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ํƒ์ƒ‰์— ์‚ฌ์šฉ

 

์šฐ์„ ์ˆœ์œ„ ํ ADT
[ํ•ต์‹ฌ ์ž‘์—…]
์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค
์ตœ๋Œ€ ์›์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๋ฉด์„œ ์‚ญ์ œํ•œ๋‹ค
์ตœ๋Œ€ ์›์†Œ๋ฅผ ์•Œ๋ ค์ค€๋‹ค
[๊ณตํ†ต]
์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊นจ๋—์ด ๋น„์šด๋‹ค

 

 

์ฃผ์š” ์šฉ์–ด
  • ๋…ธ๋“œ(Node): ํŠธ๋ฆฌ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋กœ, ํž™์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ
  • ๋ฃจํŠธ ๋…ธ๋“œ(Root Node): ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ์— ์œ„์น˜ํ•œ ๋…ธ๋“œ. ํž™์—์„œ๋Š” ์ตœ๋Œ€ ํž™์˜ ๊ฒฝ์šฐ ์ตœ๋Œ“๊ฐ’, ์ตœ์†Œ ํž™์˜ ๊ฒฝ์šฐ ์ตœ์†Ÿ๊ฐ’
  • ๋ฆฌํ”„ ๋…ธ๋“œ(Leaf Node) ๋˜๋Š” ๋ง๋‹จ ๋…ธ๋“œ(Terminal Node): ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ๋…ธ๋“œ. ํž™์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๋Š” ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ๋ ˆ๋ฒจ์— ์œ„์น˜ํ•จ
  • ๋ถ€๋ชจ ๋…ธ๋“œ(Parent Node)์™€ ์ž์‹ ๋…ธ๋“œ(Child Node): ํž™์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ ๋‘ ๊ฐœ์˜ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ์ž์‹ ๋…ธ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง
  • ๋ ˆ๋ฒจ(Level): ๋ฃจํŠธ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ. ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ๋ ˆ๋ฒจ 0์— ์œ„์น˜ํ•จ

 

์šฐ์„ ์ˆœ์œ„ ํ์˜ ์ž‘๋™ ์›๋ฆฌ
  • ์‚ฝ์ž…(Enqueue): ์ƒˆ ์š”์†Œ๋Š” ํž™์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ํ›„, ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ๋น„๊ตํ•˜๋ฉด์„œ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์ด๋™. ์ด ๊ณผ์ •์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰
  • ์‚ญ์ œ(Dequeue): ํž™์—์„œ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ๋Š” ๋ณดํ†ต ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ. ์ดํ›„ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™์‹œํ‚จ ํ›„, ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ํž™ ์†์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰

 

ํž™์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ
  • ํž™(Heap)์„ ์กฐ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์—ฐ์‚ฐ
  • ์š”์†Œ์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ ์‹œ์— ํž™์˜ ์†์„ฑ์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ, ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ์š”์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

 

 

PriorityQueue ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„์ฒด์—์„œ๋Š” "์Šค๋ฉฐ์˜ค๋ฅด๊ธฐ" (Percolate Up)์™€ "์Šค๋ฉฐ๋‚ด๋ฆฌ๊ธฐ" (Percolate Down)์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ.


offer() ๋ฉ”์†Œ๋“œ๋Š” ์ƒˆ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ "์Šค๋ฉฐ์˜ค๋ฅด๊ธฐ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ ,
poll() ๋ฉ”์†Œ๋“œ๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ "์Šค๋ฉฐ๋‚ด๋ฆฌ๊ธฐ"๋ฅผ ์ˆ˜ํ–‰ํ•จ.

 

์Šค๋ฉฐ์˜ค๋ฅด๊ธฐ (Percolate Up, Up-Heapify)

  • ์Šค๋ฉฐ์˜ค๋ฅด๊ธฐ๋Š” ์ƒˆ๋กœ์šด ์š”์†Œ๊ฐ€ ํž™์— ์ถ”๊ฐ€๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ
  • ์ƒˆ ์š”์†Œ๋Š” ์ฒ˜์Œ์— ํž™์˜ ๋ง๋‹จ(์ฆ‰, ํŠธ๋ฆฌ์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ๋ ˆ๋ฒจ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ)์— ์‚ฝ์ž…๋จ
  • ๊ทธ๋‹ค์Œ ํž™์˜ ์†์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์œ„๋กœ "์Šค๋ฉฐ์˜ค๋ฅด๊ฒŒ" ๋จ
  1. ์ƒˆ ์š”์†Œ๋ฅผ ํž™์˜ ๋ง๋‹จ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฝ์ž…๋œ ์š”์†Œ๋ฅผ ๊ทธ ๋ถ€๋ชจ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  3. ํž™์˜ ์†์„ฑ์— ๋”ฐ๋ผ, ์‚ฝ์ž…๋œ ์š”์†Œ๊ฐ€ ๋ถ€๋ชจ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉด(์ตœ๋Œ€ ํž™์—์„œ๋Š” ๋” ํฌ๊ณ , ์ตœ์†Œ ํž™์—์„œ๋Š” ๋” ์ž‘์œผ๋ฉด), ๊ทธ ์š”์†Œ๋ฅผ ๋ถ€๋ชจ์™€ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด ๊ณผ์ •์„ ์š”์†Œ๊ฐ€ ๋” ์ด์ƒ ๊ตํ™˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฃจํŠธ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

์Šค๋ฉฐ๋‚ด๋ฆฌ๊ธฐ (Percolate Down, Down-Heapify)

  • ์Šค๋ฉฐ๋‚ด๋ฆฌ๊ธฐ๋Š” ํž™์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฐ์‚ฐ
  • ํž™์—์„œ๋Š” ๋ณดํ†ต ๋ฃจํŠธ ์š”์†Œ(์ตœ๋Œ€ ํž™์—์„œ๋Š” ์ตœ๋Œ“๊ฐ’, ์ตœ์†Œ ํž™์—์„œ๋Š” ์ตœ์†Ÿ๊ฐ’)๊ฐ€ ์ œ๊ฑฐ๋จ
  • ๋ฃจํŠธ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„, ํž™์˜ ๋ง๋‹จ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™์‹œํ‚ด
  • ์ด ์š”์†Œ๋ฅผ "์Šค๋ฉฐ๋‚ด๋ฆฌ๊ฒŒ" ํ•˜์—ฌ ํž™์˜ ์†์„ฑ์„ ๋ณต๊ตฌํ•จ
  1. ๋ง๋‹จ์˜ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
  2. ์ด ์š”์†Œ์™€ ๊ทธ ์ž์‹๋“ค์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  3. ํž™์˜ ์†์„ฑ์— ๋”ฐ๋ผ, ์ด ์š”์†Œ๊ฐ€ ์ž์‹๋“ค๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉด(์ตœ๋Œ€ ํž™์—์„œ๋Š” ๋” ์ž‘๊ณ , ์ตœ์†Œ ํž™์—์„œ๋Š” ๋” ํฌ๋ฉด), ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ž์‹๊ณผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด ๊ณผ์ •์„ ์š”์†Œ๊ฐ€ ๋” ์ด์ƒ ๊ตํ™˜๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฆฌํ”„ ๋…ธ๋“œ์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.