티스토리 뷰
반응형
펜윅 트리(Fenwick Tree) aka BIT 완전 정리: 개념, 구현, 세그먼트 트리와 차이점 비교
**펜윅 트리(Fenwick Tree)**는 **Binary Indexed Tree (BIT)**라고도 불리며,
배열에서 구간 합을 빠르게 처리하기 위한 자료구조입니다.
구간 합 구하기, 누적합 업데이트가 핵심이며,
세그먼트 트리보다 간단하고 메모리 효율적이어서 실전에서 많이 쓰입니다.
이번 글에서는 Fenwick Tree의 원리, 구현법, 주요 연산,
그리고 세그먼트 트리와의 차이점과 문제 적용까지 상세히 알아봅니다.
✅ 펜윅 트리란?
정수 배열에서 누적합을 빠르게 구하거나 갱신할 수 있도록 설계된 자료구조
**시간 복잡도 O(log N)**로 쿼리 및 업데이트가 가능
🔍 구조 개념 (Binary Indexed Tree)
- 배열의 각 인덱스는 특정 범위의 구간 합을 담당합니다.
- 이 구조는 인덱스의 2진수 표현에서 가장 낮은 비트를 활용하여 구현합니다.
예:
idx = 6 (110₂) → 담당 구간 = [5~6], tree[6]은 arr[5] + arr[6]
⏱ 시간 복잡도
연산 복잡도
구간 합 | O(log N) |
값 업데이트 | O(log N) |
전체 초기화 | O(N log N) |
🛠 Python 구현 (1-based index)
class FenwickTree:
def __init__(self, size):
self.N = size
self.tree = [0] * (self.N + 1)
def update(self, i, diff):
while i <= self.N:
self.tree[i] += diff
i += (i & -i)
def query(self, i):
res = 0
while i > 0:
res += self.tree[i]
i -= (i & -i)
return res
def range_query(self, l, r):
return self.query(r) - self.query(l - 1)
✅ 사용 예시
반응형
arr = [0, 3, 2, -1, 6, 5, 4, -3, 3] # 1-based (0번 무시)
ft = FenwickTree(len(arr) - 1)
# 초기화
for i in range(1, len(arr)):
ft.update(i, arr[i])
# 1 ~ 5까지 합
print(ft.range_query(1, 5)) # 출력: 3+2+(-1)+6+5 = 15
# 4번 원소 +2
ft.update(4, 2)
print(ft.range_query(1, 5)) # 출력: 17
📘 세그먼트 트리 vs 펜윅 트리 비교
항목 세그먼트 트리 펜윅 트리 (BIT)
구현 복잡도 | 복잡 | ✅ 단순 |
메모리 사용량 | 4N | ✅ N + 1 |
지원 연산 | 다양 (최솟값, 최대값 등) | 제한적 (누적합 중심) |
구간 합 | ✅ O(log N) | ✅ O(log N) |
구간 갱신 (range update) | Lazy 필요 | ❌ 불가 (확장 필요) |
코드 길이 | 긴 편 | ✅ 매우 짧음 |
📌 정리
- 단순 누적합 → BIT
- 다양한 쿼리/구간 갱신 → Segment Tree
🔄 확장형 BIT
확장 유형 설명
Range Update / Point Query | 차 배열 사용 |
2D BIT | 행렬의 누적합 처리 가능 |
K차원 BIT | 드물지만 확장 가능 (좌표압축 활용) |
📘 실전 문제 (백준)
문제 번호 제목 내용
2042 | 구간 합 구하기 | 세그먼트 트리 or BIT 가능 |
11659 | 구간 합 구하기 4 | 누적합, BIT 적용 쉬움 |
1395 | 스위치 | BIT 응용 어려움 |
10999 | 구간 합 구하기 2 | 구간 갱신은 BIT X |
📌 결론 및 요약
- 펜윅 트리는 누적합/포인트 업데이트 중심의 자료구조로,
간단하고 빠르며 메모리 효율적 - 단, 구간 갱신 등 복잡한 연산은 세그먼트 트리에 맡기는 것이 좋음
- 코딩 테스트에서 자주 등장하며, 간단한 누적합 문제에 매우 적합
👉 다음 글에서는 **2차원 펜윅 트리(2D BIT)**의 구조와
이미지 누적합, 구간 쿼리 처리 등 실전 응용 문제를 다뤄보겠습니다.
📚 참고자료 및 출처
- 백준 11659, 2042
- TopCoder Tutorial – Fenwick Tree
- CP-Algorithms – Fenwick Tree
펜윅트리, Binary Indexed Tree, BIT, 누적합, 구간합, 파이썬 알고리즘, 세그먼트트리 비교, 코딩테스트 누적합, 자료구조 최적화, SEO 최적화 10개
'Programming' 카테고리의 다른 글
Lazy Propagation 완벽 이해: 세그먼트 트리에서 구간 업데이트를 효율적으로 처리하는 방법 (0) | 2025.04.23 |
---|---|
세그먼트 트리(Segment Tree) 완벽 정리: 기본 개념부터 구간 합, 최솟값, Lazy Propagation까지 (0) | 2025.04.22 |
최소 공통 조상(LCA: Lowest Common Ancestor) 알고리즘 정복하기 – 개념, 세 가지 구현 방법, 실전 문제 응용 (0) | 2025.04.18 |
유니온 파인드(Union-Find) 알고리즘 완전 이해: 사이클 판별, 네트워크 그룹화, MST 응용까지 (0) | 2025.04.17 |
위상 정렬(Topological Sort) 완벽 이해: 개념, 구현, 사이클 판별까지 한 번에 정리 (0) | 2025.04.16 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Ktor
- AI챗봇
- 개발블로그
- github
- 웹개발
- Next.js
- rag
- kotlin
- 관리자
- SEO최적화
- CI/CD
- 스마트 컨트랙트
- llm
- 백엔드개발
- nodejs
- fastapi
- Docker
- NestJS
- 백엔드
- seo 최적화 10개
- App Router
- 프론트엔드
- gatsbyjs
- LangChain
- nextJS
- Webpack
- REACT
- Prisma
- AI 자동화
- PostgreSQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
글 보관함
반응형