Heap

iznueยท2023๋…„ 12์›” 20์ผ
0

์ฝ”๋”ฉํ…Œ์ŠคํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
2/8
post-thumbnail
post-custom-banner

๐Ÿ“— Heap

  • ๋ฐ์ดํ„ฐ์—์„œ ์ตœ๋Œ€, ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ณ ์ž ๊ณ ์•ˆ๋œ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ

    • ๋ถ€๋ชจ ๋…ธ๋“œ idx = ์ž์‹ ๋…ธ๋“œ idx // 2
    • ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ idx = ๋ถ€๋ชจ ๋…ธ๋“œ idx * 2
    • ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ idx = ๋ถ€๋ชจ ๋…ธ๋“œ idx * 2 + 1
    • ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ ์‹œ idx๋ฅผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•จ
  • ์šฐ์„ ์ˆœ์œ„ ํ์™€ ๊ฐ™์ด ์ตœ๋Œ€, ์ตœ์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์•ผ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ™œ์šฉ๋จ

  • heap์€ max heap, min heap์œผ๋กœ ๋‚˜๋‰จ

    • max heap์€ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ํผ
    • min heap์€ ์ž์‹ ๋…ธ๋“œ๋ณด๋‹ค ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ๊ฐ’์ด ์ž‘์Œ
    • ํ˜•์ œ ๋…ธ๋“œ ๊ฐ„์—๋Š” ๋Œ€์†Œ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Œ
  • heap์€ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋ฉฐ ๋…ธ๋“œ๊ฐ€ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง

  • min heap์€ ์ตœ์†Œ๊ฐ’์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฏ€๋กœ, ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•˜์ง€ ๋ง์•„์•ผ ํ•จ!

  • heap ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”” VS ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

  • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ < ๋ถ€๋ชจ ๋…ธ๋“œ < ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง
  • heap์€ ์–ด๋Š์ชฝ์˜ ๋…ธ๋“œ ๊ฐ’์ด ํฌ๋“  ์ƒ๊ด€์ด ์—†์Œ
  • heap์€ ์ตœ๋Œ€ / ์ตœ์†Œ ๊ฒ€์ƒ‰, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ํƒ์ƒ‰์„ ์œ„ํ•œ ๊ตฌ์กฐ์ž„

๐Ÿ”” ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ๋Š” ์™ผ์ชฝ ์ตœํ•˜๋‹จ๋ถ€ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ฑ„์›Œ์ง
  • ๋ถ€๋ชจ ๋…ธ๋“œ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋ฉฐ ์ด๋ฅผ ๋ฐ˜๋ณตํ•จ

๐Ÿ”” ๋ฐ์ดํ„ฐ ์‚ญ์ œ

  • ์ตœ๋Œ€ ๋˜๋Š” ์ตœ์†Œ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋ฏ€๋กœ max heap์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์‹œ ๊ฐ€์žฅ ํฐ ๋ถ€๋ชจ ๋…ธ๋“œ(๋ฃจํŠธ) ๊ฐ’์ด ์‚ญ์ œ๋จ
  • ๊ทธ ํ›„ ๊ฐ€์žฅ ์ตœํ•˜๋‹จ๋ถ€ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์˜ฎ๊น€
  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ํฐ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ๋น„๊ตํ•˜๊ณ  ์œ„์น˜๋ฅผ ๋ฐ”๊ฟˆ(swap)

๐Ÿ”” heap functions

  • heapq ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ list๋ฅผ min heap์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • heapq.heappush(heap, item) : item์„ heap์— ์ถ”๊ฐ€ํ•จ
  • heapq.heappop(heap) : heap์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ popํ•˜๊ณ  return
  • heapq.heapify(x) : list x๋ฅผ heap์œผ๋กœ ๋ณ€ํ™˜ํ•จ
  • heap[idx] : ์ตœ์†Œ๊ฐ’์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์ฝ์Œ

๐Ÿ”” heapq๋ฅผ ์ด์šฉํ•œ max heap ๊ตฌํ˜„

  • ๊ฐ ๊ฐ’์— ๋Œ€ํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ตฌํ•œ ํ›„ (์šฐ์„  ์ˆœ์œ„, ๊ฐ’) ๊ตฌ์กฐ์˜ tuple์„ heap์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•จ
  • heap์— ์›์†Œ ์ถ”๊ฐ€ ์‹œ y = -x ๋ณ€ํ™˜์„ ํ•˜๋ฉด ์ตœ์†Ÿ๊ฐ’ ์ •๋ ฌ์ด ์ตœ๋Œ“๊ฐ’ ์ •๋ ฌ๋กœ ๋ฐ”๋€๋‹ค๋Š” ๊ฐœ๋…์„ ํ™œ์šฉํ•ด (-item, item)์˜ tuple ํ˜•์‹์œผ๋กœ ๋„ฃ์–ด์คŒ
  • heap์—์„œ ๊ฐ’์„ ์ฝ์–ด์˜ฌ ๋•Œ๋Š” ๊ฐ tuple์—์„œ idx 1์— ์žˆ๋Š” ๊ฐ’์„ ์ทจํ•จ
# example
import heapq
numx = [4,1,7,3,8,5]
heap = []
for n in nums:
	heapq.heapppush(heap, (-n, n)) # (์šฐ์„  ์ˆœ์œ„, ๊ฐ’)
while heap:
	print(heapq.heappop(heap)[1]) # idx 1
8 7 5 4 3 1 # ์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ”” heap ์ง์ ‘ ๊ตฌํ˜„


๐Ÿ“˜ ๊ด€๋ จ ๋ฌธ์ œ

โญ ๋” ๋งต๊ฒŒ
โญ ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ
โญ ์ด์ค‘์šฐ์„ ์ˆœ์œ„ํ

profile
โ‚Šหš โŠน โ™ก https://github.com/iznue
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€