SlideShare a Scribd company logo
1 of 25
Download to read offline
Prefix Sum
다양한 방법의 누적합 풀이
Prefix Sum
일반적인 배열에서
합을 구해서 사용하는 방법
Prefix Sum
Prefix Sum
시간복잡도를 더 줄일 수 없을까?
누적합의 배열을 따로 만들어
O(1)로 접근해 구하는 방법
Prefix Sum
O(1) O(MN)
Get Sum Change Value
Prefix Sum
다른 해결책이 필요!
Segment Tree or Fenwick Tree를 알아봅시다
Segment Tree
그런데 값 배열 내부에 변화가 생긴다면?
입력 배열에서 하나의 값이 변경된다면?
처음부터 다시 누적합을 계산해서 반영해야
하지 않을까?
Segment Tree
요청에 대해 빠르게 응답하기 위해 만들어진 자료구조
Segment Tree
O(log N)
O(log N)
Get Sum
Change Value
Leaf Node는 해당 배열의 값
leaf Node가 아닌 노드는
리프 노드들의 합을 가짐
Segment Tree
전체 Tree 크기
2^k > n(6이라 가정)
n보다 바로 큰 값인 k는 3가 됨
2^3 * 2 => 16
16이 트리의 크기가 됨
Segment Tree
node left child : node*2
node right child : node * 2 + 1
Segment Tree
node left child
[start, (start+end)/2]
node right child
[(start+end)/2 + 1, end]
tree의 현재 node에 저장될 값을
구하기 위해선
왼쪽 자식 & 오른쪽 자식 값을 구해야 합니다.
Segment Tree
1,2는 겹치는 경우
3,4는 서로 포함하는 관계에 있는 경우
5. 관계가 없는 경우
Segment Tree
Segment Tree
값 update는 어떻게 하는가?
숫자가 포함된 구간 node들을 모
두 변경해 주어야 함
diff를 구해야 이전 값에 변경된
상태로 update가 가능해집니다.
diff = 변경될 값 - 현재 노드 값
(val - arr[index])
1. index가 start, end 사이에
2. index가 벗어난 경우
2의 경우는 탐색을 멈추고
1의 경우는 diff만큼 각 노드들에 추
가해주자
(tree[node] =
tree[node] + diff)
Segment Tree
Fenwick Tree
Binary Index Tree(BIT)
- Element Update Effectively
Prefix Sum
공간 복잡도가 이득
구현하기 쉬움
구간 합 계산 및 값 변경 시 O(log N)으로 Segment Tree와 같음
비트 연산을 사용
Fenwick Tree
Fenwick Tree
L 배열
: 이진수로 나타내었을 때
마지막 1이 나타내는 값들을
가지는 배열
3 => 11 => 1
5 => 101 => 1
6 => 110 => 2
...
Fenwick Tree
Tree 배열을 보면,
1) Tree[12]에서 L[12] =>
12 = 1100 => 4개 합
=> A[9]+A[10]+A[11]+A[12]
의 합이 저장
2) Tree[7]에서 L[7] =>
7 = 111 => 1개의 합
A[7] 을 의미합니다.
Fenwick Tree
1101 + 1100 + 1000
마지막 1의 위치를 빼면서
찾을 수 있음
Fenwick Tree
update 시, 그 수를 담당하고
있는 구간을 모두
update해주어야 함
마지막 1의 값을 더하는
방식으로 구현
Conclusion
구간합을 구하라는 문제를 만나면
처음으로, 구간합 배열을 생각하고 나서
시간복잡도를 고민 후
Segment Tree, Fenwick Tree를 생각해보자
(개인적으로 Fenwick Tree가 구현은 더 쉬운듯합니다)
참고
• https://book.acmicpc.net/ds/segment-tree
• https://www.geeksforgeeks.org/segment-tree-set-1-
sum-of-given-range/
• https://en.wikipedia.org/wiki/Segment_tree
• https://www.acmicpc.net/blog/view/21
• https://www.acmicpc.net/blog/view/9

More Related Content

More from Ho Jeong Im

Packet에 대해서 알아보자.pdf
Packet에 대해서 알아보자.pdfPacket에 대해서 알아보자.pdf
Packet에 대해서 알아보자.pdfHo Jeong Im
 
REST에 대해 알아봅시다.pdf
REST에 대해 알아봅시다.pdfREST에 대해 알아봅시다.pdf
REST에 대해 알아봅시다.pdfHo Jeong Im
 
HTTP2에 대해서 알아보자.pdf
HTTP2에 대해서 알아보자.pdfHTTP2에 대해서 알아보자.pdf
HTTP2에 대해서 알아보자.pdfHo Jeong Im
 
허프만 코드에 대해 그림으로 알아보자.pdf
허프만 코드에 대해 그림으로 알아보자.pdf허프만 코드에 대해 그림으로 알아보자.pdf
허프만 코드에 대해 그림으로 알아보자.pdfHo Jeong Im
 
Browser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfBrowser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfHo Jeong Im
 
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdf
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdfCPU Scheduling 알고리즘에는 무엇이 있을까? .pdf
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdfHo Jeong Im
 
Database Entity, 정규화에 대해 알아보자.pdf
Database Entity, 정규화에 대해 알아보자.pdfDatabase Entity, 정규화에 대해 알아보자.pdf
Database Entity, 정규화에 대해 알아보자.pdfHo Jeong Im
 
HTTP가 가지는 특징에는 무엇이 있을까.pdf
HTTP가 가지는 특징에는 무엇이 있을까.pdfHTTP가 가지는 특징에는 무엇이 있을까.pdf
HTTP가 가지는 특징에는 무엇이 있을까.pdfHo Jeong Im
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfHo Jeong Im
 
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfOS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfHo Jeong Im
 
HSTS, Tunneling에 대해 알아보자 .pdf
HSTS, Tunneling에 대해 알아보자 .pdfHSTS, Tunneling에 대해 알아보자 .pdf
HSTS, Tunneling에 대해 알아보자 .pdfHo Jeong Im
 

More from Ho Jeong Im (11)

Packet에 대해서 알아보자.pdf
Packet에 대해서 알아보자.pdfPacket에 대해서 알아보자.pdf
Packet에 대해서 알아보자.pdf
 
REST에 대해 알아봅시다.pdf
REST에 대해 알아봅시다.pdfREST에 대해 알아봅시다.pdf
REST에 대해 알아봅시다.pdf
 
HTTP2에 대해서 알아보자.pdf
HTTP2에 대해서 알아보자.pdfHTTP2에 대해서 알아보자.pdf
HTTP2에 대해서 알아보자.pdf
 
허프만 코드에 대해 그림으로 알아보자.pdf
허프만 코드에 대해 그림으로 알아보자.pdf허프만 코드에 대해 그림으로 알아보자.pdf
허프만 코드에 대해 그림으로 알아보자.pdf
 
Browser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdfBrowser Principle에 대해 알아보자.pdf
Browser Principle에 대해 알아보자.pdf
 
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdf
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdfCPU Scheduling 알고리즘에는 무엇이 있을까? .pdf
CPU Scheduling 알고리즘에는 무엇이 있을까? .pdf
 
Database Entity, 정규화에 대해 알아보자.pdf
Database Entity, 정규화에 대해 알아보자.pdfDatabase Entity, 정규화에 대해 알아보자.pdf
Database Entity, 정규화에 대해 알아보자.pdf
 
HTTP가 가지는 특징에는 무엇이 있을까.pdf
HTTP가 가지는 특징에는 무엇이 있을까.pdfHTTP가 가지는 특징에는 무엇이 있을까.pdf
HTTP가 가지는 특징에는 무엇이 있을까.pdf
 
DP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdfDP 알고리즘에 대해 알아보자.pdf
DP 알고리즘에 대해 알아보자.pdf
 
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdfOS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
OS Process, Thread, CPU Scheduling에 대해 알아봅시다.pdf
 
HSTS, Tunneling에 대해 알아보자 .pdf
HSTS, Tunneling에 대해 알아보자 .pdfHSTS, Tunneling에 대해 알아보자 .pdf
HSTS, Tunneling에 대해 알아보자 .pdf
 

Prefix_sum.pdf