| title |
Prefix Sum |
| tags |
Data Structures |
Prefix Sum |
|
Prefix Sum dizisi bir dizinin prefixlerinin toplamlarıyla oluşturulan bir veri yapısıdır. Prefix sum dizisinin $i$ indeksli elemanı girdi dizisindeki $1$ indeksli elemandan $i$ indeksli elemana kadar olan elemanların toplamına eşit olacak şekilde kurulur. Başka bir deyişle:
$$sum_i = \sum_{j=1}^{i} {a_j}$$
Örnek bir $A$ dizisi için prefix sum dizisi şu şekilde kurulmalıdır:
| **A Dizisi** | $4$ | $6$ | $3$ | $12$ | $1$ |
|-------------------:|:---:|:-----:|:-------:|:----------:|:------------:|
| **Prefix Sum Dizisi** | $4$ | $10$ | $13$ | $25$ | $26$ |
| | $4$ | $4+6$ | $4+6+3$ | $4+6+3+12$ | $4+6+3+12+1$ |
Prefix sum dizisini kullanarak herhangi bir $[l,r]$ aralığındaki elemanların toplamını şu şekilde kolaylıkla elde edebiliriz:
$$sum_r = \sum_{j=1}^{r} {a_j}$$
$$sum_{l - 1} = \sum_{j=1}^{l - 1} {a_j}$$
$$sum_r - sum_{l-1} = \sum_{j=l}^{r} {a_j}$$
Prefix Sum dizisini kurarken $sum_i = sum_{i - 1} + a_i$ eşitliği kolayca görülebilir ve bu eşitliği kullanarak $sum[]$ dizisini girdi dizisindeki elemanları sırayla gezerek kurabiliriz:
const int n;
int sum[n + 1], a[n + 1];
// a dizisi girdi dizimiz, sum dizisi de prefix sum dizimiz olsun.
void build() {
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] + a[i];
return;
}
int query(int l, int r) {
return sum[r] - sum[l - 1];
}
Prefix sum dizisini kurma işlemimizin zaman ve hafıza karmaşıklığı $\mathcal{O}(N)$. Her sorguya da $\mathcal{O}(1)$ karmaşıklıkta cevap verebiliyoruz.
Prefix sum veri yapısı ile ilgili örnek bir probleme buradan{target="_blank"} ulaşabilirsiniz.