View Full Version : AIUTO!!! MI SPIEGATE CHE DEVO FARE???
xber-gigi
17-02-2004, 18:09
Ragazzi devo assolutamente fare questo esercizio-programma ma non ho ben capito cosa mi chiede?!?!?
Devo ralizzare un algoritmo di somma di due vettori sparsi, memorizzati nel formato a coordinate. Nei test usare vettori di ordine 100, 200, 500, in cui solo il 5% degli elementi è non nullo.
Generare a caso sia il valore di un elemento non nullo (un intero in 0,1,..,10) sia il suo indice. Usare la function rand() in <stdlib.h> per generare numeri casuali; per esempio, se numero_casuale è un int, la chiamata numero_casuale=rand()%11; genera un numero casuale intero (distribuzione uniforme) nell’insieme (0,1,2,..,10).
Che significa????
L'esercizio ti spiega come generarti due vettori casuali e sommarli. Un vettore è sparso se gli elementi non nulli sono molto pochi, il tuo esercizio indica adesempio che ci sono il 5% di elementi non nulli. Se consideri vettori di 100 elementi, 95 elementi varranno zero, gli altri 5 saranno diversi da zero. Utilizzando la funzione rand ti generi 5 numeri casuali tra 0 e 99: questi saranno gli indici degli elementi non nulli. Poi per ogni indice ti generei un numero a caso tra 1 e 10 sempre con la funzione rand. In questo modo ti compili causalmente i due vettori, che andranno sommati, non so se l'esercizio richiede di utilizzare qualche particolare algoritmo per la somma, in genere per vettori/matrici sparse si possono adottare algoritmi un po modificati che danno migliori prestazioni in certe operazioni, ma non li conosco.
Ciao
xber-gigi
17-02-2004, 18:44
Originariamente inviato da anx721
L'esercizio ti spiega come generarti due vettori casuali e sommarli. Un vettore è sparso se gli elementi non nulli sono molto pochi, il tuo esercizio indica adesempio che ci sono il 5% di elementi non nulli. Se consideri vettori di 100 elementi, 95 elementi varranno zero, gli altri 5 saranno diversi da zero. Utilizzando la funzione rand ti generi 5 numeri casuali tra 0 e 99: questi saranno gli indici degli elementi non nulli. Poi per ogni indice ti generei un numero a caso tra 1 e 10 sempre con la funzione rand. In questo modo ti compili causalmente i due vettori, che andranno sommati, non so se l'esercizio richiede di utilizzare qualche particolare algoritmo per la somma, in genere per vettori/matrici sparse si possono adottare algoritmi un po modificati che danno migliori prestazioni in certe operazioni, ma non li conosco.
Ciao
Innanzitutto grazie mille per la tua risposta! :)
Potresti un pò chiarimri la parte riguardante l'indice??? Che devo fare???
Devo quindi creare due array di grandezza 100??? (o meglio 500)
Crei un array di 100 elementi. Poi devi sceglierti a caso quali indici saranno occupati da numeri non nulli. Per fare ciò fai un cilco for di lungezza pari a 5 (5 è il 5% di 100), e in ogni iterazione sfrutti la funziona rand per generarti un numero causale tra 0 e 99: questo numero rappresenta un indice in cui inserirai un elemento diverso da zero. Se la funzione rand ti restituisce un indice già uscito, lo puoi incrementare o decrementare fino a trovare un indice in cui non è gia stato inserito un numero non nullo.
xber-gigi
19-02-2004, 16:12
Originariamente inviato da anx721
Se la funzione rand ti restituisce un indice già uscito, lo puoi incrementare o decrementare fino a trovare un indice in cui non è gia stato inserito un numero non nullo.
Ho risolto così:
while (vett2[posizione]!=0)
{
posizione=posizione+1;
}
Dici che va bene?
Originariamente inviato da xber-gigi
Ho risolto così:
while (vett2[posizione]!=0)
{
posizione=posizione+1;
}
Dici che va bene?
Come concetto va bene, ma devi fare una piccola modifica perche se no puoi esaurire tutti gli indicidell'array senza trovarne uno libero:
posizione = (posizione+1) % 100;
in questo modo, con l'operazione di modulo, se arrivi all'indice 99 senza aver trovato un indice libero, riprendi a controllare a partire da zero. (Questo per vettori di cento elementi, per vettori di 500 elementi ovviamente sostituisci 500 con 100)
xber-gigi
19-02-2004, 16:59
Per costa sta quel % ???
Cmq grazie mille per le risposte! :D
Originariamente inviato da xber-gigi
Per costa sta quel % ???
Cmq grazie mille per le risposte! :D
% indica l'operazione di modulo:
n % m dà come il risultato il resto della divisione intera n:m. E' facile verificare che n%m è un numero compreso tra 0 e m-1. L'operazione di modulo quindi la puoi usare ogni volta che vuoi incrementare una variabile inmodo "circolare", cioè la variabile può assumere un valore massimo max-1, dopodichè ritorna al valore zero:
0, 1, 2,3,....max - 1, 0, 1, 2...max - 1, 0...
Quindi, con l'operazione
n = (n + 1) % max
se n + 1 è minore di max ad n si assegna n + 1, altrimenti ad n viene assegnato zero.
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.