๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š ์ „๊ณต ๊ณต๋ถ€/๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•

[๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•] 6. ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ

1. Segment Tree

๋ถ€๋ถ„ํ•ฉ ๋ฌธ์ œ์—์„œ ์‘์šฉ ๊ฐ€๋Šฅ

์ƒ์„ฑ ์ฝ”๋“œ

 

2. ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ

[start, end]์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๋ฉด ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ์„ ์ ๊ฒ€ํ•œ๋‹ค. ๋…ธ๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ๊ฐ„์ด [left, right]๋ผ๋ฉด ๋‹ค์Œ์˜ 4๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ ๊ฒฝ์šฐ๋งˆ๋‹ค ์ฒ˜๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(1) [start, end]์™€ [left, right]๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์Œ

    -> ํ•  ์ผ์ด ์—†๋‹ค

(2) [start, end]๊ฐ€ [left, right]๋ฅผ ํฌํ•จ

    -> ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋‘” [left, right]์˜ ํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.

(3) [start, end]๋ฅผ [left, right]๊ฐ€ ํฌํ•จ

    -> ๋‘ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํžˆ ์–ด๋Š ๋…ธ๋“œ๊ฐ€ [left, right]๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ์ฐพ๋Š”๋‹ค.

(4) [start, end]๊ฐ€ [left, right]์™€ ํฌํ•จ๊ด€๊ณ„๋Š” ์—†์ง€๋งŒ ๊ฒน์นจ

    -> ๋‘ ์ž์‹ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ •ํ™•ํžˆ ์–ด๋Š ๋…ธ๋“œ๊ฐ€ [left, right]๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ์ฐพ๋Š”๋‹ค.

 

์˜ˆ์ œ ) Sum(2,8) = ?

 

ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜

 

3. ๊ฐฑ์‹  (update)

index์œ„์น˜์˜ ์ˆ˜๋ฅผ diff๋งŒํผ ๋ฐ”๊พธ์—ˆ๋‹ค๋ฉด ํŠธ๋ฆฌ๋Š” Top-down ํ˜•์‹์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋ฃจํŠธ์—์„œ node=1์ด๊ณ , ์ด ๋…ธ๋“œ๋Š” [start, end] ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ์ €์žฅํ•œ๋‹ค.

index๊ฐ€ [start, end] ๋ฒ”์œ„ ์•ˆ์— ์—†๋‹ค๋ฉด ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๊ณ ,

๋ฒ”์œ„์— ์žˆ๋‹ค๋ฉด ์ด ๋…ธ๋“œ์— ์ €์žฅ๋œ ๊ฐ’์„ diff๋งŒํผ ๋Š˜๋ฆฌ๊ณ , ๋˜‘๊ฐ™์€ ๊ณผ์ •์„ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ ์ž์‹์— ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜

 

4. ์  ์œ„์˜ ์„ ๋ถ„ ์ˆ˜ ์„ธ๊ธฐ

๊ตฌ๊ฐ„ [0,N] ์œ„์˜ ์„ ๋ถ„ n๊ฐœ๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ฐ€์žฅ ๋งŽ์ด ์ค‘๋ณต๋˜๋Š” ์„ ๋ถ„์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ

(1) brute force -> ๊ฐ ์ ๋งˆ๋‹ค ์ž์‹  ์œ„๋ฅผ ์ง€๋‚˜๋Š” ์„ ๋ถ„์˜ ์ˆ˜ ์„ธ๊ธฐ : O(Nn)

(2) line sweeping -> O(n log n)

์  -> ๊ตฌ๊ฐ„

๊ตฌ๊ฐ„์˜ ๋๋งˆ๋‹ค ์„ ๋ถ„์ด ์‹œ์ž‘ํ•˜๋ฉด +1, ๋๋‚˜๋ฉด -1์„ ํ•ด์ค€๋‹ค

2 : +1

5 : +1

11 : -1

11 : -1

...

72 : +1

85 : +1

 

์ด๋ ‡๊ฒŒ ์ˆœํšŒ๋ฅผ ํ•ด์ฃผ๋ฉด ๊ฐ ๊ตฌ๊ฐ„์˜ ๋ถ€๋ถ„ํ•ฉ์ด ๊ตฌํ•ด์ง„๋‹ค. ์ด ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๊ตฌ๊ฐ„์ด ๊ฐ€์žฅ ๋งŽ์€ ์„ ๋ถ„์ด ์ค‘๋ณต๋˜๋Š” ๊ตฌ๊ฐ„์ด๋‹ค.

๋ผ์ธ์Šค์œ„ํ•‘ ์‹œ ์ •๋ ฌํ•˜๋Š”๋ฐ O(n log n), start์— +1์„ ํ•˜๊ณ  end์—์„œ -1์„ ํ•ด์ฃผ๋Š”๋ฐ 2๋ฒˆ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(2n).

์ด O(n log n) ์†Œ์š”.

 

(3) ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ : O(n log n)

๊ตฌ๊ฐ„์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๊ณ , ๊ตฌ๊ฐ„ ์‚ฌ์ด ์„ ๋ถ„์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด?

๋ชจ๋“  ์„ ๋ถ„์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•จ.

 

๋…ธ๋“œ๋ฅผ ๊ตฌ๊ฐ„์œผ๋กœ ์žก์€ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์„ ๋ถ„์„ ์ €์žฅํ•œ๋‹ค

set์„ ์“ฐ๋Š” ์ด์œ ๋Š” ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ๋˜๋ฏ€๋กœ ๊ฐ™์€ ๊ตฌ๊ฐ„์ด ๊ฒน์นœ๋‹คํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

inserting์„ ํ•  ๋•Œ๋Š” ํ•ด๋‹น ์„ ๋ถ„์„ ๋”ฑ ๋งž๊ฒŒ ํฌํ•จํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๊ตฌ๊ฐ„๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค

ํ•ด๋‹น ์„ ๋ถ„์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ž์‹์—๋Š” ์งˆ์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ค‘๊ฐ„์— ๊ตฌ๊ฐ„์ด ๋‚˜๋‰ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿผ ๋‘ ๊ตฌ๊ฐ„์— ๋ชจ๋‘ ์ €์žฅํ•œ๋‹ค.

 

O(n log n) = ํŠธ๋ฆฌ ์ƒ์„ฑ ์‹œ๊ฐ„

์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ง€๋‚˜๊ฐ„ ์„ ๋ถ„ ์ˆ˜๋ฅผ ์„ธ๋Š”๋ฐ์— O(n), ์ด O(n log n)

 

 

5. ๋˜๋‹ค๋ฅธ ๋ฌธ์ œ : ์  ์œ„์˜ ๊ฐ€์žฅ ๊ธด ์„ ๋ถ„

abs(์™ผ์ชฝ๊ฐ’ - ์˜ค๋ฅธ์ชฝ๊ฐ’)์œผ๋กœ ์„ ๋ถ„์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ex: ์  24 ์œ„์˜ ๊ฐ€์žฅ ๊ธด ์„ ๋ถ„?

-> 24๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ๊ฐ„์ธ 23,25 ์œ„์˜ ๊ฐ€์žฅ ๊ธด ์„ ๋ถ„์ด ๋‹ต์ด ๋œ๋‹ค.

 

๊ตฌ๊ฐ„์— ํฌํ•จ๋˜๋Š” ์„ ๋ถ„์€ 2๊ฐœ์ธ๋ฐ, abs(17-31) < abs(23-53) ์ด๋ฏ€๋กœ [23, 53]์ด ์ตœ์žฅ์„ ๋ถ„์ด๋‹ค.

 

์„ ๋ถ„์ด n๊ฐœ ์žˆ์œผ๋‹ˆ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์˜ leaves = O(n)

๋…ธ๋“œ ์ˆ˜ = O(n)

๋†’์ด = O(log n)

ํ•˜๋‚˜์˜ ์„ ๋ถ„์€ ์ตœ๋Œ€ O(log n)๊ฐœ์˜ ๋…ธ๋“œ์— ์ €์žฅ

์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ = O(n log n) = ํŠธ๋ฆฌ ์ƒ์„ฑ ์‹œ๊ฐ„

์ ์„ ์ฐพ๋Š”๋ฐ์— O(log n), ์ด O(n log n)