티스토리 뷰
세그먼트 트리와 매우 비슷하지만, 구현이 훨씬 간단한 펜윅 트리(Fenwick Tree) 에 대해 알아보자.
펜윅 트리도 구간 수정과 쿼리를 수행할 수 있지만, $1$~$i$ 까지의 구간에 대해서만 연산할 수 있다.
때문에 보통은 누적합에 대한 쿼리와 수정 연산에 사용된다.
펜윅 트리의 동작 과정에 대한 간략한 설명만 하고 자세한 설명은 생략한다.
*https://www.acmicpc.net/blog/view/21
*https://www.topcoder.com/community/competitive-programming/tutorials/binary-indexed-trees/
위 그림과 같이 BIT 에서의 배열의 각 칸은 자신으로부터 이진수 표현의 마지막 비트 전까지의 구간을 의미한다.
struct BIT
{
int n; vector<int> tree;
BIT(int n) : n(n), tree(n+10);
int sum(int i) { int ret=0; for(; i>0; i-=(i&-i)) ret+=tree[i]; return ret; }
void update(int i, int val) { for(; i<=n; i+=(i&-i)) tree[i]+=val; }
};
1. sum()
$1$~$i$ 까지의 합들을 구해야한다.
주어진 $i$부터 시작해, 마지막 비트를 계속 빼주며 0이될때까지 더해주면 된다.
$i$~$j$ 까지의 누적합이 필요하면, sum() 을 두번 호출한 후 빼주면 된다.
시간복잡도 : $O(logN)$
2. update()
$i$번 칸에 $x$를 더하는 연산이다.
주어진 $i$부터 시작해 마지막 비트를 계속 더해주며 $n$이 될때까지 반복하면 된다.
시간복잡도 : $O(logN)$
특히 펜윅 트리는 N 차원 자료구조로 사용될 수 있으며 코드도 거의 똑같다.
만약 좌표압축을 할 수 없는 경우 트리의 값들을 map 에 넣어주면 공간복잡도가 줄어드는 대신 시간복잡도가 $logN$ 씩 곱해지게 된다.
'알고리즘 & 자료구조 정리' 카테고리의 다른 글
Segment Tree Lazy Propagation (0) | 2019.02.15 |
---|---|
트리의 지름 (0) | 2019.01.02 |
세그먼트 트리 (Segment Tree) (0) | 2018.12.27 |
- Total
- Today
- Yesterday
- Segment Tree
- Merge Sort
- stack
- APIO
- Line sweeping
- ⭐
- Union Find
- ioi
- HLD
- tree
- Codeforces
- graph
- Centroid Decomposition
- Shortest path
- Sparse Table
- DP
- Greedy
- Sqrt Decomposition
- BOJ
- convex hull
- Interactive
- Persistent Segment Tree
- Divide & Conquer
- Fenwick Tree
- Lazy Propagation
- DFS
- Floyd-Warshall
- Parametric Search
- offline
- CHT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |