Ένας πίνακας 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 — ένα τεράστιο κέρδος όταν τα ερωτήματα είναι συχνά.
Το μοτίβο της προ-υπολογισμού και της γρήγορης απάντησης γενικεύεται σε πολλές εργασίες επεξεργασίας δεδομένων.
Είναι θεμέλιο της ανταγωνιστικής προγραμματισμού και ένα συνηθισμένο δομικό στοιχείο στην ανάλυση.
Μια βιβλιοθήκη ερωτήσεων συνέντευξης IT με αναλυτικές απαντήσεις — από Junior έως Senior.
Δωρεά