15/05/11 9:58
belledetta
ciao ho svolto un programmino che genera un vettore di numeri casuali(con ripetizioni), poi una volta inserito un valore x cerca tutte le possibili coppie di valori presenti nel vettore che diano come somma x.
Se ho fatto bene i miei conti la complessità dovrebbe essere di circa O(n^2), è possibile ottimizzare il programma?
Ho provato a ottimizzare l'algoritmo in questo modo e spero che il ragionamento sia corretto:
1) ordino il vettore con merge sort) ->o(nlogn)
2) cerco le posizione dell'elemento x nel vettore (chiamiamo j la posizione) con la ricerca dicotomica-> o(logn)
3) cerco le posizione dell'elemento x/2(se esiste altrim in numero strettam minore)(posizione k) -> o(log(n/2))
3) effettuo i confronti sommando gli elementi con posizione da 1a k e gli elementi da k+1 a j -> caso peggiore: n^2/4, caso migliore: o(1)
di fatto non ho ottimizzato nulla!!! qualcuno sa aiutarmi???
Se ho fatto bene i miei conti la complessità dovrebbe essere di circa O(n^2), è possibile ottimizzare il programma?
Ho provato a ottimizzare l'algoritmo in questo modo e spero che il ragionamento sia corretto:
1) ordino il vettore con merge sort) ->o(nlogn)
2) cerco le posizione dell'elemento x nel vettore (chiamiamo j la posizione) con la ricerca dicotomica-> o(logn)
3) cerco le posizione dell'elemento x/2(se esiste altrim in numero strettam minore)(posizione k) -> o(log(n/2))
3) effettuo i confronti sommando gli elementi con posizione da 1a k e gli elementi da k+1 a j -> caso peggiore: n^2/4, caso migliore: o(1)
di fatto non ho ottimizzato nulla!!! qualcuno sa aiutarmi???
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int main() { long long int v[N]={0}; int i=0; //variabile decisionale per il riempimento int n=0; //dimensione vettore int x=0; // valore da cercare int yes=0; //flag per sapere se è stato trovata almeno una coppia /************************************************************************ * RIEMPIMENTO VETTORE * ************************************************************************/ printf("Inserisci dimensione del vettore\n"); scanf("%d",&n); printf("digita:\t1 per inserimento da input\t2 per inserimento automatico casuale\n"); scanf("%d",&i); srand(time(NULL)); if (i==1) for (int j=0; j<n; j++) scanf("%d",&v[j]); //inserimento manuale else for (int j=0; j<n; j++) v[j]=rand(); //inserimento automatico for( int j=0; j<n; j++) printf("v[%d] = %d\n",j+1,v[j]); //stampa vettore /************************************************************************ * RICERCA * ************************************************************************/ printf("\ninserisci un valore compreso tra 0 e %d\n",RAND_MAX); scanf("%d",&x); for(int j=0; j<n; j++) for(int k=j+1; k<n; k++) if(v[j]+v[k]==x) {printf("\nv[%d]+ v[%d] = %d + %d = %d \n",j+1,k+1,v[j],v[k],x); yes=1;} if(yes==0) printf("\n non ci sono valori nel vettore la cui somma sia uguale e %d\n",x); return 0; }
aaa