online: 4; azi: 346; total: 52352 Manual clasa a xi a - Tehnici de programare - Divide et impera

Manual clasa a Xi a

Tehnici de programare

Divide et impera

Să se calculeze simultan produsul şi suma a n numere memorate într-un vector.
#include < iostream >
using namespace std ;
struct Result {
int produs;
int suma;
};
Result divideEtImpera ( int v[], int start , int end ) {
Result result ;
if ( start == end ) {
result.produs = v[ start ];
result.suma = v[ start ];
} else if ( start + 1 == end ) {
result.produs = v[ start ] * v[ end ];
result.suma = v[ start ] + v[ end ];
} else {
int mid = ( start + end ) / 2 ;
Result left = divideEtImpera (v, start , mid );
Result right = divideEtImpera (v, mid + 1 , end );
result.produs = left.produs * right.produs ;
result.suma = left.suma + right.suma ;
}
return result ;
}
int main () {
int n = 5 ; // Exemplu: vectorul { 1 , 2 , 3 , 4 , 5 }
int v[] = { 1 , 2 , 3 , 4 , 5 };
Result result = divideEtImpera (v, 0 , n - 1 );
cout << "Produsul este " << result.produs << endl ;
cout << "Suma este " << result.suma << endl ;
return 0 ;
}
n acest exemplu, am definit și inițializat vectorul cu elementele {1, 2, 3, 4, 5}
. În funcția divideEtImpera , am folosit același algoritm ca și în exemplul anterior pentru a calcula produsul și suma vectorului. Singura diferență constă în faptul că elementele vectorului sunt stocate într-un vector clasic în loc de librăria vector.
Acest algoritm are o complexitate temporală de O(n log n), deoarece împărțim vectorul în jumătate la fiecare apel recursiv.