Pole prefix sum uchovává kumulativní součty, aby bylo možné odpovědět na jakýkoli range sum v O(1) po O(n) předzpracování — místo O(n) na dotaz.
Myšlenka
Nechť je součet prvních prvků. Potom součet je .
Pole prefix sum uchovává kumulativní součty, aby bylo možné odpovědět na jakýkoli range sum v O(1) po O(n) předzpracování — místo O(n) na dotaz.
Nechť je součet prvních prvků. Potom součet je .
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
Ideální pro mnoho range-sum dotazů na statických datech. Variace: 2D prefix sums pro součty submatic, prefix XOR a difference arrays pro aktualizace rozsahů. Pokud se pole často mění, místo toho použijte Fenwick/segment tree. Pozor na offset indexu (velikost n+1).
Prefix sums mění opakované O(n) range queries na O(1) vyhledávání — obrovský zisk, když jsou dotazy časté.
Vzor jednoho předzpracování a rychlé odpovědi se zobecňuje na mnoho úloh zpracování dat.
Je to nezbytná součást konkurenčního programování a běžný stavební blok v analýze.
Knihovna IT otázek k pohovoru s podrobnými odpověďmi — od Junior po Senior.
Přispět