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}\]
Örnek Kod Parçaları¶
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:
Zaman Karmaşıklığı¶
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 ulaşabilirsiniz.