Segment Tree

μ„Έκ·Έλ¨ΌνŠΈ νŠΈλ¦¬λŠ” νŠΉμ • κ΅¬κ°„μ˜ 뢀뢄합을 κ΅¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜κ³  이진 트리의 ν˜•νƒœλ₯Ό 띄고 μžˆλ‹€.

μ„Έκ·Έλ¨ΌνŠΈ νŠΈλ¦¬λŠ” O(logn)O(logn)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 뢀뢄합을 ꡬ할 수 μžˆλ‹€.

λ¨Όμ € λ‹¨μˆœν•œ λ°©λ²•μœΌλ‘œ κ΅¬κ°„μ˜ 숫자λ₯Ό μ „λΆ€ 더해 뢀뢄합을 κ΅¬ν•˜λŠ” 경우, O(n)O(n) μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§ˆ 것이닀. λ˜λŠ” 각 μ›μ†ŒκΉŒμ§€μ˜ 합을 λ‚˜νƒ€λ‚΄λŠ” 배열을 μ΄μš©ν•œλ‹€λ©΄, 배열을 μž…λ ₯받은 ν›„O(1)O(1) 에도 κ°€λŠ₯ν•  것이닀.

ν•˜μ§€λ§Œ, μ›μ†Œμ˜ 값이 바뀐닀면 μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? νŠΉμ • μ›μ†Œκ°’μ΄ 바뀐닀면, κ²°κ΅­ 합을 λ‚˜νƒ€λ‚΄λŠ” 배열을 μ‚¬μš©ν•˜λ”λΌλ„ O(n)O(n) 이 μ†Œμš”λœλ‹€.

λ”°λΌμ„œ O(logn)O(logn) 이 μ†Œμš”λ˜λŠ” μ„Έκ·Έλ¨ΌνŠΈ 트리λ₯Ό μ‚¬μš©ν•œλ‹€.

μ„Έκ·Έλ¨ΌνŠΈ νŠΈλ¦¬λŠ” λ‹€μŒκ³Ό 같이 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

각 λ…Έλ“œ μ•ˆμ˜ μˆ«μžλŠ” ν•©μ˜ λ²”μœ„λ₯Ό λœ»ν•œλ‹€.

즉 λ£¨νŠΈλ…Έλ“œλŠ” 0~5번 μ›μ†Œμ˜ ν•©, 각 리프 λ…Έλ“œλŠ” 각 μ›μ†Œ 자체의 값을 λœ»ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 이 ꡬ쑰λ₯Ό 톡해 μ–΄λ–»κ²Œ μƒμ„±ν•˜κ³  합을 κ΅¬ν•˜κ³  값을 λ³€κ²½ν•  수 μžˆμ„κΉŒ?

생성

κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ λ°°μ—΄(tree)을 μ΄μš©ν•œλ‹€. μ›μ†Œμ˜ κ°œμˆ˜κ°€ N개일 λ•Œ, 4N만큼의 크기의 배열을 μƒμ„±ν•œλ‹€. λ„‰λ„‰ν•œ 크기의 배열을 μƒμ„±ν•˜λŠ” 것이닀.

이 λ•Œ tree 의 인덱슀의 μ‹œμž‘μ„ 1이라고 μ„€μ •ν•˜λŠ” 것이 νŽΈν•˜λ‹€. νŠΉμ • λ…Έλ“œμ—μ„œ 인덱슀 * 2λŠ” μ™Όμͺ½ μžμ‹ λ…Έλ“œ, 인덱슀 * 2 + 1은 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œλ₯Ό κ°€λ₯΄ν‚€κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€.

생성은 μž¬κ·€λ₯Ό μ΄μš©ν•œλ‹€. λ£¨νŠΈμ—μ„œλΆ€ν„° μ‹œμž‘ν•΄μ„œ λ²”μœ„κ°€ 1인 리프 λ…Έλ“œμ— λ„λ‹¬ν•˜κ²Œ 되면 μ›μ†Œκ°’μ„ μ €μž₯ν•œλ‹€. λ²”μœ„κ°€ 2 이상이라면 μ™Όμͺ½ μžμ‹μ˜ λ…Έλ“œκ°’κ³Ό 였λ₯Έμͺ½ μžμ‹μ˜ λ…Έλ“œκ°’μ„ λ”ν•œλ‹€.

ꡬ간합 κ΅¬ν•˜κΈ°

μš°λ¦¬κ°€ κ΅¬ν•˜κ³ μž ν•˜λŠ” ꡬ간이 2~5 라고 ν•΄λ³΄μž.

κ·Έλ ‡λ‹€λ©΄ 각 λ…Έλ“œμ˜ ꡬ간이 μžˆμ„ λ•Œ 3κ°€μ§€ 경우둜 λ‚˜λˆŒ 수 μžˆλ‹€.

  • λ…Έλ“œμ˜ ꡬ간이 μ›ν•˜λŠ” ꡬ간 밖에 μžˆμ„ λ•Œ β‡’ 0

  • λ…Έλ“œμ˜ ꡬ간 내에 μ›ν•˜λŠ” ꡬ간에 μ‘΄μž¬ν•  λ•Œ β‡’ μ™Όμͺ½ μžμ‹κ³Ό 였λ₯Έμͺ½ μžμ‹μœΌλ‘œ λ‚˜λˆ„μ–΄ μ‘°μ‚¬ν•œλ‹€.

  • λ…Έλ“œμ˜ ꡬ간이 μ›ν•˜λŠ” ꡬ간 내에 μ‘΄μž¬ν•  λ•Œ β‡’ κ·Έ 값을 λ”ν•œλ‹€.

μœ„μ˜ 3κ°€μ§€ μΌ€μ΄μŠ€λ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

예λ₯Ό λ“€μ–΄, μœ„μ˜ μ΄λ―Έμ§€μ—μ„œ μš°λ¦¬κ°€ μ›ν•˜λŠ” ꡬ간이 [4, 5]라고 ν•΄λ³΄μž.

  • [0, 5]

    • [3, 5]

      • [3, 4]

        • [4]

      • [5]

[0, 5]μ—μ„œλΆ€ν„° 타고 λ‚΄λ €κ°€μ„œ κ²°κ΅­ [4]와 [5]λ₯Ό λ”ν•΄μ„œ [4, 5] ꡬ간합을 λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

κ°’ λ³€κ²½

μ„Έκ·Έλ¨ΌνŠΈ νŠΈλ¦¬μ—μ„œ νŠΉμ • μ›μ†Œμ˜ 값을 λ³€κ²½ν•˜κ²Œ λœλ‹€λ©΄, μ™Όμͺ½ μžμ‹ λ…Έλ“œμ™€ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ 쀑에 ν•΄λ‹Ή μ›μ†Œ 값을 ν¬ν•¨ν•œ λΆ€λΆ„ν•©μ˜ λ…Έλ“œμΌ 경우 값을 λ³€κ²½ν•΄μ£Όλ©΄ λœλ‹€.

μ°Έκ³ 

https://velog.io/@kimdukbae/자료ꡬ쑰-μ„Έκ·Έλ¨ΌνŠΈ-트리-Segment-Tree

Last updated