포슀트

πŸŒ“ Heap

πŸ’« @TODO


Heap
κ·Έλž˜ν”„μ˜ 트리 ꡬ쑰 쀑 ν•˜λ‚˜
μš°μ„ μˆœμœ„ 큐 Priority Queueλ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λ¨

μš°μ„ μˆœμœ„ νλŠ” 데이터 ꡬ쑰의 ν•˜λ‚˜λ‘œμ„œ 데이터λ₯Ό 자유둭게 μΆ”κ°€ν•  수 있음
반면, 데이터λ₯Ό μΆ”μΆœν•  λ•ŒλŠ” μ΅œμ†Ÿκ°’λΆ€ν„° μˆœμ„œλŒ€λ‘œ μ„ νƒλ©λ‹ˆλ‹€
-> μΆ”κ°€λŠ” 자유둭게, μΆ”μΆœ μ‹œ μž‘μ€ κ°’λΆ€ν„° κΊΌλ‚΄λŠ” 것

νž™μ„ ν‘œν˜„ν•˜λŠ” 트리 κ΅¬μ‘°μ—μ„œλŠ” 각 정점은 λ…Έλ“œ Node라고 뢀름
νž˜μ—μ„œλŠ” 각 λ…Έλ“œμ— 데이터가 μ €μž₯됨

λ…Έλ“œλ“€μ€ μ΅œλŒ€ 두 개의 μžμ‹ λ…Έλ“œλ₯Ό κ°€μ§ˆ 수 있음
트리의 λͺ¨μ–‘은 λ°μ΄ν„°μ˜ κ°œμˆ˜μ— μ˜ν•΄ μ •ν•΄μ§‘λ‹ˆλ‹€

λ…Έλ“œλŠ” μœ„μ—μ„œλΆ€ν„° μ±„μ›Œμ§€λ©°, 같은 μΈ΅(단)μ—μ„œλŠ” μ™Όμͺ½λΆ€ν„° μ±„μ›Œμ§‘λ‹ˆλ‹€
읽을 λ•Œλ„ λ§ˆμ°¬κ°€μ§€

νž™μ—μ„œλŠ” 데이터 μ €μž₯ μœ„μΉ˜λ₯Ό μ •ν•˜κΈ° μœ„ν•΄ μžμ‹ λ…Έλ“œμ˜ μˆ«μžλŠ” λ°˜λ“œμ‹œ λΆ€λͺ¨μ˜ μˆ«μžλ³΄λ‹€ μ»€μ•Όν•œλ‹€λŠ” κ·œμΉ™μ΄ 있음
λ”°λΌμ„œ κ°€μž₯ μœ„ (뿌리, Root)에 κ°€μž₯ μž‘μ€ μˆ«μžκ°€ λ“€μ–΄μžˆμŒ

데이터λ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” 이 κ·œμΉ™μ„ 지킀기 μœ„ν•΄ κ°€μž₯ μ•„λž˜ 측에 μžˆλŠ” μ™Όμͺ½ λ…Έλ“œλΆ€ν„° 값을 채움
κ°€μž₯ μ•„λž˜ 측이 λͺ¨λ‘ μ±„μ›Œμ§€λ©΄ μƒˆλ‘œμš΄ 측을 λ§Œλ“€μ–΄μ„œ κ°€μž₯ μ™Όμͺ½μ— 채움

κ΅¬ν˜„ (μΆ”κ°€)

  1. 일단 λ¨Όμ € 남은 μžλ¦¬μ— μ €μž₯
  2. λΆ€λͺ¨μ˜ μˆ«μžκ°€ 크면 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΆ€λͺ¨μ™€ μžμ‹μ„ κ΅ν™˜ (κ΅ν™˜μ΄ λ°œμƒν•˜μ§€ μ•Šμ„ λ•ŒκΉŒμ§€ 반볡)

κ΅¬ν˜„ (μΆ”μΆœ)

  1. κ°€μž₯ μœ„μ— μžˆλŠ” 숫자 μΆ”μΆœ (κ°€μž₯ μž‘μ€ μˆ˜λΆ€ν„° λ‚˜μ˜€λ‹ˆκΉŒ), 이후 μž¬κ΅¬μΆ•
  2. κ°€μž₯ 후미에 μžˆλŠ” 숫자λ₯Ό κ°€μž₯ μœ„λ‘œ 이동 (μ €μž₯ μˆœμ„œκ°€ μœ„μ—μ„œ μ•„λž˜, μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μ΄λ―€λ‘œ)
  3. (κ΅ν™˜) λΆ€λͺ¨μ˜ μˆ«μžκ°€ 크면 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΆ€λͺ¨μ™€ μžμ‹μ„ κ΅ν™˜ (κ΅ν™˜μ΄ λ°œμƒν•˜μ§€ μ•Šμ„ λ•ŒκΉŒμ§€ 반볡)

μΆ”κ°€ : μž¬κ΅¬μΆ• O(log2 N) (트리의 높이(log2 N)와 λΉ„λ‘€, μ•„λž˜ λ°©ν–₯)
μΆ”μΆœ : O(1) + μž¬κ΅¬μΆ• O(log2 N) (트리의 높이(log2 N)와 λΉ„λ‘€, μœ— λ°©ν–₯)

λ‹€μ΅μŠ€νŠΈλΌ


🫧


이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.