-
알고리즘: (BIT 부분 합, 누적 합)알고리즘 2024. 3. 27. 18:45
부분 합:
A[n]배열이 있을 때, a,b (0<=a,b<=n)가 주어지면,
A[a]~A[b]까지 더하는 문제.
1. Brute-force
1. 순회하여 부분 합을 구한다.
전처리: x
시간복잡도: O(n)
2. O(n) 전처리, O(sqrt(n)) 질의
1. 배열 A를 sqrt(n)개의 원소씩 그룹으로 묶음
2. 각각의 합을 구함
3. a, b가 주어지면 양 끝부분의 합만 직접 구하고 중간 부분은 미리 구한 합을 더해줌
전처리: O(n)
시간복잡도: O(sqrt(n))
전처리 후 sqrt(n)개의 그룹,
worst case: a=1, b=n-1
중간 값을 처리하는 시간복잡도: sqrt(n)-2 (총 그룹의 수-양 끝의 2그룹)
양 끝 값을 처리하는 시간복잡도: 2sqrt(n) (양 그룹의 원소의 수)
총 시간 복잡도 = 3sqrt(n)-2 = O(sqrt(n))
업데이트: O(sqrt(n))
원소가 바뀐 그룹만 다시 전처리함
3. O(n) 전처리, O(1)질의
1~i까지의 합인 PrefixSum[i]를 미리 다 구함.
Sum(a, b) = PrefixSum[b] - PrefixSum[a-1]
전처리: O(n)
시간복잡도: O(1)
업데이트: O(n)
4. BIT (Binary Indexed Tree)
L[i]:
i를 2진수로 나타냈을 때 마지막 1에 해당하는 값
ex: L(6) = 2 (6=>0110=>0010 = 2)
구하는 법:
L[i] = i & -i
Tree[i]:
A[i]부터 L[i]개의 값 만큼 더한다.
prefixSum[i]:
ex: prefixSum[13] = Tree[13]+ Tree[12] + Tree[8]
13-L[13] = 12 -L[12] = 8 -L[8] = 0 (i -= (i & -i))
업데이트:
전처리: O(n)
시간복잡도: O(log n)
업데이트: O(log n)
'알고리즘' 카테고리의 다른 글
알고리즘: Convex Hull(컴벡스 헐), Graham Scan, Quick Hull (0) 2024.06.01 알고리즘: 확장 유클리드 호제법 (0) 2024.05.28 알고리즘: 유클리드 호제법(최대공약수, gcd) (0) 2024.05.28 알고리즘: CCW(Counter Clock Wise) (0) 2024.05.23 알고리즘: RMQ (0) 2024.03.25