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
