← Все вопросы

Что такое префиксные суммы и зачем они нужны?

Задан 14 месяцев назад691 просмотров3 ответа
17

Слышал, что префиксные суммы помогают быстро считать сумму на отрезке массива. Не до конца понимаю идею. Объясните, пожалуйста, на примере и покажите, когда это реально выручает.

3 ответа

26

Идея: заранее посчитать массив pre, где pre[i] это сумма всех элементов до i-го включительно. Тогда сумма на отрезке [l, r] это pre[r] - pre[l-1] за O(1) вместо O(n) на каждый запрос.

a = [3, 1, 4, 1, 5, 9]
pre = [0]
for x in a:
    pre.append(pre[-1] + x)

# сумма a[l..r] включительно (0-индексация):
def range_sum(l, r):
    return pre[r + 1] - pre[l]

print(range_sum(1, 3))  # 1+4+1 = 6

Зачем: если запросов на суммы много (например q штук), наивно это O(n*q), а с префиксными суммами O(n + q). Классика для задач, где много раз спрашивают сумму подотрезка.

Павел Дмитриев Удобно завести pre[0]=0, тогда не надо отдельно обрабатывать l=0. · 13 месяцев назад
8

Считаешь суммы заранее один раз, потом любой отрезок — вычитанием двух чисел.

5

Сумма отрезка за O(1).

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект