PDA

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????

anx721
17-02-2004, 18:22
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)

anx721
17-02-2004, 19:35
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?

anx721
19-02-2004, 16:47
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

anx721
19-02-2004, 17:09
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.