Zovšeobecnenia

Podobne ako pri prefixových súčtoch, kde sčítavame prvky prefixov, môžeme použiť podobnú techniku aj pre iné operácie. Napríklad pre násobenie, kde by sme počítali prefixové súčiny – súčiny prvkov v jednotlivých prefixoch. Tu si však treba dať pozor, ak by sa v postupnosti nachádzala nula, súčin by bol vždy nulový od miesta, kde sa nula vyskytne.

Zamyslime sa, prečo by sme nemohli použiť prefixové súčty pre operáciu max(L,R), ktorá by vrátila najväčší prvok v danom intervale. Pri súčtoch sme využili to, že súčet intervalu je s[R] - s[L]. Pri operácii max by sme podobný vzťah nenašli.

Všeobecne platí, že prefixové techniky (ako prefixové súčty) sa dajú efektívne použiť pre operácie, ktoré tvoria takzvanú grupu. Grupa je matematický pojem pre operácie $\odot$ na danej množine $M$ s nasledovnými vlastnosťami:

  • asociatívnosť: $(a \odot b) \odot c = a \odot (b \odot c)$
  • existencia neutrálneho prvku: $a \odot e = a$
  • existencia inverzného prvku: $a \odot a^{-1} = e$
  • výsledok operácie musí patriť do množiny $M$

Sčítanie nad reálnymi číslami do tejto kategórie patrí.

Prefixové súčty sa dajú zovšeobecniť aj do dvoch (alebo viacerých) rozmerov. Toto rozšírenie nám potom umožní rýchlo počítať súčty čísel v obdĺžnikových častiach dvojrozmerného poľa (predstav si napríklad tabuľku alebo mriežku čísel). Viac o tomto zaujímavom zovšeobecnení sa dozvieš v ďalšej časti tohto kurzu.

Ak potrebujeme často meniť čísla v poli a zároveň rýchlo počítať súčty v rôznych úsekoch, prefixové súčty nie sú ideálne. Prečo? Pretože pri každej zmene čísla v poli by sme museli znova prepočítať všetky prefixové súčty od miesta zmeny až do konca. To trvá $O(n)$ času, čo je pri veľkých poliach pomalé. Neskôr si ukážeme intervalový strom, ktorý tento problém dokáže riešiť v $O(\log n)$.