Ένας πίνακας prefix sum αποθηκεύει αθροιστικά σύνολα ώστε οποιοδήποτε range sum να μπορεί να απαντηθεί σε O(1) μετά από O(n) προεπεξεργασία — αντί O(n) ανά ερώτημα.
Η ιδέα
Έστω το άθροισμα των πρώτων στοιχείων. Τότε το άθροισμα του είναι .
Ένας πίνακας prefix sum αποθηκεύει αθροιστικά σύνολα ώστε οποιοδήποτε range sum να μπορεί να απαντηθεί σε O(1) μετά από O(n) προεπεξεργασία — αντί O(n) ανά ερώτημα.
Έστω το άθροισμα των πρώτων στοιχείων. Τότε το άθροισμα του είναι .
prefix[i]iarr[l..r]prefix[r+1] - prefix[l]def build_prefix(arr):
prefix = [0] * (len(arr) + 1)
for i, x in enumerate(arr):
prefix[i + 1] = prefix[i] + x # running total
return prefix
def range_sum(prefix, l, r): # inclusive l..r
return prefix[r + 1] - prefix[l] # O(1)
p = build_prefix([2, 4, 1, 3, 5])
range_sum(p, 1, 3) # 4+1+3 -> 8
arr = [2, 4, 1, 3, 5]
prefix = [0, 2, 6, 7, 10, 15]
sum(1..3) = prefix[4] - prefix[1] = 10 - 2 = 8
Ιδανικό για πολλά range-sum ερωτήματα σε στατικά δεδομένα. Παραλλαγές: 2D prefix sums για αθροίσματα υποπινάκων, prefix XOR και difference arrays για ενημερώσεις εύρους. Αν το array αλλάζει συχνά, χρησιμοποιήστε αντί αυτού ένα Fenwick/segment tree. Προσέξτε την μετατόπιση δείκτη (μέγεθος n+1).
Τα prefix sums μετατρέπουν επαναλαμβανόμενα O(n) range queries σε O(1) lookups — ένα τεράστιο κέρδος όταν τα ερωτήματα είναι συχνά.
Το μοτίβο της προ-υπολογισμού και της γρήγορης απάντησης γενικεύεται σε πολλές εργασίες επεξεργασίας δεδομένων.
Είναι θεμέλιο της ανταγωνιστικής προγραμματισμού και ένα συνηθισμένο δομικό στοιχείο στην ανάλυση.