Documente Academic
Documente Profesional
Documente Cultură
Considerăm un tabloul cu elemente numerice. În unele probleme se cere să determinăm rapid suma
elementelor din anumite secvențe date. Desigur, o soluție este parcurgerea tuturor elementelor din secvență
și determinarea sumei, dar această operație are complexitatea O(n), iar dacă numărul de sume care trebuie
calculate este mare soluția poate fi inacceptabilă.
În asemenea situații putem folosi sumele parțiale.
Pentru a determina rapid această sumă, vom construi un vector auxiliar, S[], cu următoarea
semnificație: S[i]=X[1]+X[2]+...+X[i]. Acest vector se construiește în timp liniar, folosind următoarea
relație de recurență:
S[i]={ 0 ,dacă i=0
X[i]+X[i+1]+...+X[j]=S[j]−S[i−1]
Astfel:
X[4]+X[5]+X[6]+X[7]=S[7]−S[3]=28−16
=28−16=12
Observație: Este posibil ca suma elementelor din vectorul X[] să depășească limita maximă a tipului de
date folosit (ex. int), ceea ce duce la overflow. În acest caz, vectorul S[] trebuie declarat de un tip mai larg
(ex. long long int).
Secvență C++
int n, X[100001], S[100001];
//citire n, X[]
S[0] = 0;
Pentru matricea de mai sus, să calculăm suma elementelor din submatricea cu colțul stânga-sus la
coordonatele (2,3) și colțul dreapta-jos la coordonatele (3,5). La fel ca în cazul vectorilor, considerăm,
pentru simplitate, că liniile și coloanele matricei sunt indexate de la 1.
Parcurgerea element cu element a submatricei are complexitate O(n⋅m). Pentru o complexitate constantă
considerăm matricea S[][] a sumelor parțiale, astfel:
S[i][j] – suma elementelor din submatricea cu colțul stânga-sus la coordonatele (1,1) și colțul
dreapta-jos la coordonatele (i,j). Elementele de pe linia 0 și coloana 0 vor avea valoarea 0:
Odată construită această matrice, pentru determinarea sumei elementelor din submatricea cu colțul stânga-
sus la coordonatele (is,js) și colțul dreapta-jos la coordonatele (ij,jj) vom folosi următoarea formulă:
Matricea S[][] se construiește similar cu modul în care se determină suma din submatrice:
Secvență C++
int n,m, A[1001][1001], S[1001][1001];
//citire n,m,A[][]
Probleme ataşate
Nr. Problema Clasa Dificultate Operații I/O