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์ธ ์ฌ๋์ด ๋ช๋ช ์ธ์ง ์์๋ด๋ฉด ๋๋ค.
'๐ ์ ๊ณต ๊ณต๋ถ > ๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 6. ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (0) | 2023.04.18 |
---|---|
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 5. ์์ฌ์์ด ๊ธฐ๋ฒ (0) | 2023.04.17 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 4. ์๋ฃ๊ตฌ์กฐ2 (0) | 2023.04.16 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 2. ๊ธฐ์ด์ํ (0) | 2023.04.16 |
[๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ] 1. C++ (0) | 2023.04.16 |