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

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

[๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•] 3. ์ž๋ฃŒ๊ตฌ์กฐ1

1. RMQ : Range Minimum Query (๋ฒ”์œ„ ์ตœ์†Œ ์ฟผ๋ฆฌ)

๋ฐฐ์—ด์˜ ๋ถ€๋ถ„๋ฐฐ์—ด์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ

 

< ๋ฐฉ๋ฒ• >

(1) O(n^3) ์ „์ฒ˜๋ฆฌ, O(1) ์งˆ์˜ : brute force ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•œ RMQ(a,b)์— ๋Œ€ํ•œ ๋‹ต์„ ๋ชจ๋‘ ์ €์žฅํ•ด๋†“๋Š”๋‹ค. n^2์นธ์„ ์ฑ„์›Œ์•ผํ•˜๊ณ , ํ•œ ์นธ์„ ์ฑ„์šธ ๋•Œ ์ตœ๋Œ€ O(n)์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

(2) O(n^2) ์ „์ฒ˜๋ฆฌ, O(1) ์งˆ์˜ : ๊ฐ€๋Šฅํ•œ RMQ(a,b)์— ๋Œ€ํ•œ ๋‹ต์„ ๋ชจ๋‘ ์ €์žฅํ•˜๋Š”๋ฐ, RMQ(a,b+1) = min(RMQ(a,b) , A[b+1])์„ ์‚ฌ์šฉํ•˜์—ฌ n^2์นธ์„ ๊ฐ๊ฐ O(1)์˜ ์‹œ๊ฐ„์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค.

(3) O(n) ์ „์ฒ˜๋ฆฌ, O(sqrt(n)) ์งˆ์˜ : ๋ฐฐ์—ด์„ sqrt(n) ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ ๊ฐ ๋ฌถ์Œ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š”๋ฐ์— O(n)์ด ๊ฑธ๋ฆฌ๋ฉฐ, RMQ(a,b)๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋ฏธ ๋‹ต์„ ๊ตฌํ•ด๋†“์€ ๊ตฌ๊ฐ„์—์„œ๋Š” ๋”์ด์ƒ ๋น„๊ต๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

(4) O(n log n) ์ „์ฒ˜๋ฆฌ, O(1) ์งˆ์˜ : ๊ฐ A[i] ๋งˆ๋‹ค RMQ(i,i+1), RMQ(i,i+2), RMQ(i,i+4), ... ์˜ ์ •๋‹ต์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด๋†“๋Š”๋‹ค.

๊ตฌํ•ด์•ผ ํ•  ์ •๋‹ต ์ˆ˜๋Š” ์ตœ๋Œ€ n*log n๊ฐœ์ด๋‹ค.

 

 

2. ๋ถ€๋ถ„ํ•ฉ ๋ฌธ์ œ

Sum(a, b) = A[a] + ... + A[b]

 

(1) O(n) ์ „์ฒ˜๋ฆฌ, O(sqrt(n)) ์งˆ์˜

- ๋ฐฐ์—ด์„ sqrt(n) ๋ฌถ์Œ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. ๊ฐ ๋ฌถ์Œ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

- Sum(a,b) ์งˆ์˜ ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์–‘ ๋๋ถ€๋ถ„์˜ ํ•ฉ์€ ์ง์ ‘ ๊ตฌํ•˜๊ณ , ์ค‘๊ฐ„์— ์ด๋ฏธ ๊ตฌํ•œ ๊ฐ’๋“ค์€ ์ถ”๊ฐ€ ๊ณ„์‚ฐ์—†์ด ๋”ํ•ด์ค€๋‹ค

- ์งˆ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ ๊ทธ๋ฃน ์ œ์™ธ ์‹œ ์ตœ๋Œ€ sqrt(n)-2 ๊ฐœ์˜ ์ˆ˜, ๊ฐ€์žฅ์ž๋ฆฌ์— ์ตœ๋Œ€ 2*sqrt(n)๊ฐœ์˜ ์ˆ˜

    -> ์ด O(sqrt(n)) ์‹œ๊ฐ„

- update๋Š” i๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน๋งŒ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ O(sqrt(n)) ์‹œ๊ฐ„

 

(2) O(n) ์ „์ฒ˜๋ฆฌ, O(1) ์งˆ์˜

- O(n) ์‹œ๊ฐ„์— PrefixSum[i] = A[1] + ... + A[i] ๊ณ„์‚ฐ (1๋ถ€ํ„ฐ ๋ณธ์ธ๊นŒ์ง€ ํ•ฉ ๊ณ„์‚ฐ)

- Sum(a,b) = PrefixSum[b] - PrefixSum[a-1]

- update : PrefixSum ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋ฏ€๋กœ O(n) ์‹œ๊ฐ„

 

 

3. BIT : binary indexed tree (= Fenwick tree)

L[i] = i๋ฅผ ์ด์ง„์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ ๋งˆ์ง€๋ง‰ 1์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’

Tree[i] = A[i]๋ถ€ํ„ฐ ์•ž์œผ๋กœ L[i]๊ฐœ ๊ฐ’์˜ ํ•ฉ

 

L[i] = i & -i

(-i = ~i + 1)

 

4. PrefixSum[i]

 

์•„๋ž˜์—์„œ PrefixSum[13] = Tree[13] + PrefixSum[12] = Tree[13] + Tree[12] + PrefixSum[8]

= Tree[13] + Tree[12] + Tree[8]

 

// Fenwick Tree
int sum(int i){
	int a = 0;
    while(i>0){
    	a += tree[i];
        i -= (i&-i);
    }
    return a;
}

// tree update
void update(int i, int num){
	while(i<=n){
    	tree[i] += num;
        i += (i&-i);
    }
}

 

- ํŠธ๋ฆฌ ์ƒ์„ฑ ์‹œ ๋ชจ๋“  ๊ฐ’์ด 0์œผ๋กœ ์ดˆ๊ธฐํ™”

- ๋ชจ๋“  PrefixSum 0์œผ๋กœ ์ดˆ๊ธฐํ™”

- A[i]=x๊ฐ€ ๋ ๋•Œ๋งˆ๋‹ค update(i,x) ํ˜ธ์ถœ = ์ตœ๋Œ€ log n๋ฒˆ ํ˜ธ์ถœ๋จ

์ด O(n log n) ์‹œ๊ฐ„, ์งˆ์˜๋Š” O(log n) ์‹œ๊ฐ„

 

 

5. ์—ฐ์Šต๋ฌธ์ œ : ๋‹ฌ๋ฆฌ๊ธฐ

n๋ช…์˜ ์‚ฌ๋žŒ์ด ๋‹ฌ๋ฆฌ๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ์‚ฌ๋žŒ๋“ค์˜ ์›๋ž˜ ๋‹ฌ๋ฆฌ๊ธฐ ๋“ฑ์ˆ˜๋Œ€๋กœ ์ด ์‚ฌ๋žŒ๋“ค์„ 1~n์œผ๋กœ ์ด๋ฆ„์„ ๋ถ™์ด์ž. ๋‹ฌ๋ฆฌ๊ธฐ ๋„์ค‘์— ์‚ฌ๋žŒ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด๋ฉด 1~n ์‚ฌ์ด์˜ permutation์ผ ๊ฒƒ์ด๋‹ค. ๋‹ฌ๋ฆฌ๊ธฐ๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€, ์ด ์‚ฌ๋žŒ๋“ค์€ ์ž๊ธฐ๋ณด๋‹ค ์•ž์—์žˆ๋Š” ์‚ฌ๋žŒ ์ค‘ ์ž์‹ ๋ณด๋‹ค ๋“ฑ์ˆ˜๊ฐ€ ๋‚ฎ๊ฑฐ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค์€ ์•ž์ง€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
๋ ˆ์ด์Šค๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ๊ฐ ์‚ฌ๋žŒ๋“ค์ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ  ๋“ฑ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
์˜ˆ๋ฅผ ๋“ค์–ด, 6๋ช…์ด ๋‹ฌ๋ฆฌ๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ๊ณ  ์ค‘๊ฐ„ ๋“ฑ์ˆ˜๊ฐ€ 3, 1, 5, 2, 4, 3๋ผ๊ณ  ํ•˜์ž.
์ฒซ๋ฒˆ์งธ 3๋ฒˆ์€ 1๋“ฑ (์ตœ์†Œํ•œ ๋ณธ์ธ ๋“ฑ์ˆ˜๋Š” ์œ ์ง€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ)
1๋ฒˆ์€ 1๋“ฑ (์ž๊ธฐ ์•ž์˜ 3์€ ์•ž์ง€๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ)
5๋ฒˆ์€ 3๋“ฑ (3, 1์„ ์•ž์ง€๋ฅผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ)
2๋ฒˆ์€ 2๋“ฑ
4๋ฒˆ์€ 4๋“ฑ
๋‘๋ฒˆ์งธ 3๋ฒˆ์€ 3๋“ฑ

ํ’€์ด

์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•.

๋งจ ์•ž์˜ ์‚ฌ๋žŒ์€ 1๋“ฑ์ด ์ตœ๊ณ  ๋“ฑ์ˆ˜์ธ ๊ฒƒ์ด ์ž๋ช…ํ•˜๋‹ค.

์•ž์— i๋ช…์ด ์žˆ์„ ๋•Œ i+1๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ๋“ฑ์ˆ˜๋Š” ์•ž์˜ i๋ช… ์ค‘ ๋ณธ์ธ๋ณด๋‹ค ๋‹ฌ๋ฆฌ๊ธฐ๋ฅผ ์ž˜ํ•˜๋Š” ์‚ฌ๋žŒ ์ˆ˜ + 1 ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•œ๋‹ค.

๋ฐฐ์—ด A[i]์˜ ๊ฐ’์€ ๋‹ฌ๋ฆฌ๊ธฐ ์‹ค๋ ฅ์ด i์ธ ์‚ฌ๋žŒ์ด ๋ช‡๋ช…์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ํ˜„์žฌ x๋“ฑ์ธ ์‚ฌ๋žŒ์˜ ๋‹ฌ๋ฆฌ๊ธฐ ์‹ค๋ ฅ์ด i ์ผ๋•Œ, 1๋“ฑ์—์„œ x-1๋“ฑ์ธ ์‚ฌ๋žŒ๋“ค ์ค‘ ๋‹ฌ๋ฆฌ๊ธฐ ์‹ค๋ ฅ์ด 1 ~ i-1์ธ ์‚ฌ๋žŒ์ด ๋ช‡๋ช…์ธ์ง€ ์•Œ์•„๋‚ด๋ฉด ๋œ๋‹ค.