Prefiksų sumos masyvas saugo kumuliatyvias sumas, todėl bet kuri diapazone sumos užklausa gali būti atsakyta per O(1) po O(n) išankstinio apdorojimo — o ne O(n) per užklausą.
Idėja
Tegu yra pirmųjų elementų suma. Tada suma yra .
Prefiksų sumos masyvas saugo kumuliatyvias sumas, todėl bet kuri diapazone sumos užklausa gali būti atsakyta per O(1) po O(n) išankstinio apdorojimo — o ne O(n) per užklausą.
Tegu yra pirmųjų elementų suma. Tada suma yra .
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
Idealus daugeliui diapazone sumų užklausų statiniuose duomenyse. Variantai: 2D prefiksų sumos submatricų sumoms, prefiksų XOR ir skirtumo masyvai diapazone atnaujinimams. Jei masyvas keičiasi dažnai, naudokite Fenwick/segment medį. Stebėkite indekso poslinkį (dydis n+1).
Prefiksų sumos paverčia pasikartojančias O(n) diapazone užklausas į O(1) paieškos — didžiulis pelnas, kai užklausų yra daug.
Išankstinis skaičiavimas kartą, greitai atsakykite šablonas apibendrina daugybę duomenų apdorojimo užduočių.
Tai pagrindinė konkurencinio programavimo elemento ir dažnas analitikos kūrimo blokas.
IT pokalbių klausimų biblioteka su išsamiais atsakymais — nuo Junior iki Senior.
Paaukoti