1. 대수 구조의 정의
Monoid (단양군)
집합 M과 이항 연산 ∗의 쌍 (M,∗)이 다음 두 조건을 만족하면 Monoid라고 한다.
1. 결합 법칙 (Associativity): ∀a,b,c∈M,(a∗b)∗c=a∗(b∗c)
2. 항등원 존재 (Identity): ∃e∈M,∀a∈M,e∗a=a∗e=a
Group (군)
Monoid (M,∗)가 다음 조건을 추가로 만족하면 Group이라고 한다.
3. 역원 존재 (Inverse): ∀a∈M,∃a−1∈M,a∗a−1=a−1∗a=e
예로, <Z,+>, <Zn∗,∗> 는 Group 이다.
2. Prefix Sum의 정의와 Group에 의한 O(1) 증명
정의
수열 A= <a1,a2,…,an> ⊂G에 대하여 Prefix Sum S는 다음과 같이 재귀적으로 정의된다.
s0=e,si=si−1∗ai
구간 쿼리 증명 (Group)
구간 [l,r]의 연산 결과 Pl,r=al∗al+1∗⋯∗ar이라 할 때, sr=sl−1∗Pl,r이 성립한다.
(G,∗)가 Group이면 역원 sl−1−1이 존재하므로,
sl−1−1∗sr=sl−1−1∗(sl−1∗Pl,r)
결합 법칙에 의해
sl−1−1∗sr=(sl−1−1∗sl−1)∗Pl,r=e∗Pl,r=Pl,r
따라서 Pl,r=sl−1−1∗sr로 O(1) 계산이 가능하다.
예시
수열 A= <a1,a2,…,an> ∈Zn 와 쿼리 [l,r] 에 대해 ∑i=lrai 를 구한다고 하자.
<Z,+>는 Group이므로 Prefix Sum S를 정의할 수 있다.
+ 연산자에서 정수 a의 역원은 −a이므로 sl−1−1=−sl−1 이다.
스위핑, 차분배열 또한 역원을 사용하므로 Prefix Sum과 비슷하다.
3. Segment Tree와 Monoid의 수학적 증명
Segment Tree는 구간 [l,r]을 서로소인 부분 구간들의 합집합으로 분할한다.
Group이 아닌 Monoid로 충분한 이유
임의의 구간 [L,R]이 Segment Tree의 노드 집합 {v1,v2,…,vk}에 의해 관리되는 부분 구간들의 합집합으로 분할된다고 가정한다.
[L,R]=[i1,j1]∪[i2,j2]∪⋯∪[ik,jk]
이때 각 노드 vm에 저장된 값을 Val(vm)이라 하면, 전체 구간의 값은 다음과 같다.
Val(v1)∗Val(v2)∗⋯∗Val(vk)
-
결합 법칙의 필연성:
Segment Tree는 완전 이진 트리 구조로 연산을 수행하므로, 계산 순서가 ((v1∗v2)∗v3)…와 같이 고정되지 않고 트리의 형태에 따라 임의의 괄호 배치가 발생한다.
∀vi,vj,vk, (vi∗vj)∗vk=vi∗(vj∗vk) 가 만족되어야만 트리의 분할 방식에 관계없이 동일한 값을 보장한다.
-
역원의 불필요성:
Segment Tree는 sr에서 sl−1을 제거하는 방식이 아니라, 필요한 구간들만을 합성하여 값을 구축한다. 따라서 x∗x−1=e와 같은 역원 연산이 논리적으로 필요하지 않다.
-
항등원의 역할:
쿼리 범위 밖의 노드를 처리할 때 v=v∗e 연산을 수행함으로써 알고리즘의 일관성을 유지한다.
좋은 글이네용가리치킨