Skip to content

Prefix Sum


Prefix Sum dizisi bir dizinin prefixlerinin toplamlarıyla oluşturulan bir veri yapısıdır. Prefix sum dizisinin ii indeksli elemanı girdi dizisindeki 11 indeksli elemandan ii indeksli elemana kadar olan elemanların toplamına eşit olacak şekilde kurulur. Başka bir deyişle:

sumi=j=1iajsum_i = \sum_{j=1}^{i} {a_j}

Örnek bir AA dizisi için prefix sum dizisi şu şekilde kurulmalıdır:

A Dizisi 44 66 33 1212 11
Prefix Sum Dizisi 44 1010 1313 2525 2626
44 4+64+6 4+6+34+6+3 4+6+3+124+6+3+12 4+6+3+12+14+6+3+12+1

Prefix sum dizisini kullanarak herhangi bir [l,r][l,r] aralığındaki elemanların toplamını şu şekilde kolaylıkla elde edebiliriz:

sumr=j=1rajsum_r = \sum_{j=1}^{r} {a_j}

suml1=j=1l1ajsum_{l - 1} = \sum_{j=1}^{l - 1} {a_j}

sumrsuml1=j=lrajsum_r - sum_{l-1} = \sum_{j=l}^{r} {a_j}

Örnek Kod Parçaları

Prefix Sum dizisini kurarken sumi=sumi1+aisum_i = sum_{i - 1} + a_i eşitliği kolayca görülebilir ve bu eşitliği kullanarak sum[]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];
}

Zaman Karmaşıklığı

Prefix sum dizisini kurma işlemimizin zaman ve hafıza karmaşıklığı O(N)\mathcal{O}(N). Her sorguya da O(1)\mathcal{O}(1) karmaşıklıkta cevap verebiliyoruz.

Prefix sum veri yapısı ile ilgili örnek bir probleme buradan ulaşabilirsiniz.