Algoritmo:segmento di somma vicina a zero
sono riuscito a fare l'algoritmo che calcola il segmento di somma massima che metto qui di seguito:
il mio problema adesso è che invece di calcolare il sottovettore la cui somma di elementi è massima,
voglio calcolare il sottovettore la cui somma di elementi è la più vicina a 0.
ho provato a risolvere il problema con il seguente algoritmo:
che ovviamente non funziona, io ero abbastanza sicuro che una volta risolto il problema del segmento di somma massima questo mi sarebbe stato piuttosto facile... e invece no.
grazie in anticipo a chi mi dice cosa sbaglio.
int main(){
const int n=10;
int v[n]={-7,4,-8,3,4,-2,6,-10,1,3};
int somma=0;
int sommamax=0;
for(int i=0;i<n;i++){
if(somma>0)somma+=v[i];
else somma=v[i];
if(sommamax<somma)sommamax=somma;
}
cout<<sommamax<<endl;
return 0;
}il mio problema adesso è che invece di calcolare il sottovettore la cui somma di elementi è massima,
voglio calcolare il sottovettore la cui somma di elementi è la più vicina a 0.
ho provato a risolvere il problema con il seguente algoritmo:
int main(){
const int n=4;
int v[n]={-7,3,-2,6};
int somma=0;
int sommamax=10;
for(int i=0;i<n;i++){
if(abs(somma)+v[i]>abs(sommamax))somma=v[i];
else somma+=v[i];
if(abs(sommamax)>abs(somma))sommamax=somma;
}
cout<<sommamax<<endl;
return 0;
}che ovviamente non funziona, io ero abbastanza sicuro che una volta risolto il problema del segmento di somma massima questo mi sarebbe stato piuttosto facile... e invece no.
grazie in anticipo a chi mi dice cosa sbaglio.
Risposte
Il problema è che il segmento di somma massima e il segmento con somma più vicina a zero hanno proprietà diverse e non è possibile usare lo stesso metodo per entrambe.
In teoria con due cicli (quindi $O (n^2 )$ ) si può fare.
Per ogni elemento, trovi la somma di esso con ogni altro elemento del vettore da controllare e confronti tale somme.
Col valore assoluto dovresti beccare quella esatta.
Ma penso si possa fare meglio, tipo come un ordinamento $O( n logn)$
Ma aspetta che Apa o Vic confermino, non ti fidare di me
Per ogni elemento, trovi la somma di esso con ogni altro elemento del vettore da controllare e confronti tale somme.
Col valore assoluto dovresti beccare quella esatta.
Ma penso si possa fare meglio, tipo come un ordinamento $O( n logn)$
Ma aspetta che Apa o Vic confermino, non ti fidare di me