Algoritmi e programmazione avanzata

Algoritmi e programmazione avanzata
Compito d’esame
Parte di teoria
24 Febbraio 2014
Non si possono consultare testi e appunti. Durata della prova: 50 minuti.
1 (2.0 punti)
La seguente funzione ricorsiva
void f (int n) {
if (n>=10 || n<0) {
return;
}
printf ("%d ", n);
f (n+1);
f (n+2);
return;
}
viene richiamata mediante l’istruzione f(5).
Riportare l’albero di ricorsione e l’output generato dalla sua esecuzione.
2 (1.0 punti)
Si ordini in maniera ascendente mediante counting-sort il seguente vettore di interi:
3 4 5 2 6 5 4 2 8 1 4 1 8 0
Si indichino i passaggi rilevanti.
4
3 (2.0 punti)
Una coda a priorit`a `e inizialmente vuota e implementata mediante un heap in cui il valore massimo si posiziona sulla
testa della struttura.
Nella seguente sequenza di chiavi intere e caratteri:
10 22 29 71 * * 58 * 34 9 31 * * 14 * 41 27 18
ogni intero deve essere inserito nella coda, e ogni carattere ’*’ corrisponde a una estrazione del valore massimo dalla coda.
Riportare la configurazione della coda dopo ogni operazione, e la sequenza di valori ritornati durante il procedimento.
4 (2.0 punti)
Un albero binario di 12 nodi, fornisce le seguenti tre
pre-order:
33 41 23
in-order:
23 41
7
post-order: 23
7 11
Disegnare l’albero originario.
sequenze
1
7
1 11
1 41
di visita dei propri vertici:
11 17 19 13
3 27
33 13 19 17 27
3
13 19 27
5
3 17
5
5
33
5 (2.0 punti)
Si supponga di aver memorizzato tutti i numeri compresi tra 1 e 1000 in un albero di ricerca binario e che si stia cercando
il numero 531. Tra le sequenze successive, si determini quali non possono essere le sequenze esaminate durante la ricerca
e ne si motivi la ragione.
500 550 510 540 533 539 532 531
500 600 580 570 510 520 530 540 535 531
570 100 200 300 400 500 660 550 520 525 530 531
610
30 600
60 588 117 519 299 301 477 531
continua
6 (3.0 punti)
Sia dato il grafo orientato rappresentato in figura:
A
C
B
E
D
F
G
I
L
H
Lo si rappresenti come lista delle adiacenze (0.5 punti) e come matrice delle adiacenze (0.5 punti). Considerando a come
vertice di partenza:
• se ne effettui una visita in profondit`
a, etichettando i vertici con i tempi di scoperta e di fine elaborazione nel formato
tempo1/tempo2 (1.5 punti). Qualora necessario, si trattino i vertici secondo l’ordine alfabetico.
• lo si ridisegni, etichettando gli archi come T (tree), B (back), F (forward), C (cross) (0.5 punti).
Algoritmi e programmazione avanzata
Compito d’esame
Parte di programmazione
24 Febbraio 2014
Non si possono consultare testi e appunti. Durata della prova: 100 minuti.
La parte di programmazione prevede, in alternativa, la risoluzione:
• Dell’esercizio 1 (tradizionale) di valore massimo uguale a 18 punti.
• Degli esercizi 2, 3 e 4 (facilitati) con punteggio complessivo massimo uguale a 12 punti.
Non sono possibili soluzioni miste.
1 (18.0 punti)
Un grafo orientato pesato `e memorizzato su file mediante l’elenco dei suoi archi.
Ogni riga del file ha il seguente formato:
idV1 val idV2
che indica che il vertice di identificatore idV1 `e connesso con un arco orientato di peso val (valore intero) al vertice idV2.
Si osservi che il numero di vertici del grafo `e indefinito e che ciascun vertice `e individuato mediante un identificatore
alfanumerico di lunghezza massima uguale a 20 caratteri.
La figura successiva riporta un esempio di file e della relativa rappresentazione grafica del grafo memorizzato.
A 3 Bb
Bb 2 CcC
A 4 dDd
CcC 1 dDd
A
3
2
4
dDd
Bb
1
CcC
Si vuole scrivere un’applicazione C in grado di:
• ricevere il nome di un file contenente la descrizione del grafo sulla riga di comando.
• leggere il grafo e memorizzarlo in una opportuna struttura dati.
• verificare se il grafo `e regolare o meno. Un grafo orientato si dice regolare se e solo se tutti i vertici hanno lo stesso
grado di ingresso e di uscita e questi due valori sono uguali tra loro.
• effettuare un’iterazione all’interno della quale viene letto l’identificatore di un vertice.
– se l’identificatore letto `e uguale a fine il programma deve terminare.
– in caso contrario il programma deve determinare il cammino semplice con sorgente nel vertice indicato per il
quale la somma dei pesi degli archi `e maggiore. Per tale cammino occorre visualizzare su standard output
l’elenco dei vertici attraversati, l’elenco dei pesi degli archi e il peso totale.
continua
2 (2.0 punti)
Sia dato un vettore di N interi. Si realizzi una funzione ROTATE di shift del vettore a destra o a sinistra di P posizioni,
dove P `e un intero (positivo per shift a destra, negativo per shift a sinistra).
` vietato realizzare lo shift di P posizioni come l’iterazione di P shift da 1 posizione ciascuno, che avrebbe costo O(N ·P ).
E
Si richiede invece un algoritmo O(N ), che operi come segue. Utilizzando un vettore ausiliario di P posizioni, allocato
dinamicamente, l’algoritmo sposta temporaneamente P elementi dal vettore originario. Sposta quindi i rimanenti N − P
elementi nella loro destinazione finale. I P elementi salvati nel vettore ausiliario sono quindi collocati nella loro destinazione
finale. La funzione liberi la memoria allocata al termine del procedimento.
3 (4.0 punti)
Una matrice si dice “sparsa” quando la maggior parte delle caselle contiene un valore nullo. Nel caso di una matrice
sparsa, pu`o risultare conveniente l’utilizzo di una struttura dati che allochi dinamicamente memoria per le sole caselle
non nulle.
Si realizzi in C, per una matrice sparsa di numeri reali (float), la funzione di prototipo
void matInsert (matr_t *mat, int r, int c, float val);
che inserisce il valore val nell’elemento di riga r e colonna c della matrice mat.
Il tipo matr t `e una struct che, oltre a contenere le due dimensioni della matrice (numero di righe nr e numero di colonne
nc) punta a un vettore (di dimensione nr) di puntatori a righe, ognuna realizzata mediante una lista, contenente gli
elementi non nulli della riga corrispondente.
Si definisca la struttura matr t, il tipo struttura utilizzato per implementare le liste lungo le righe della matrice e si scriva
la funzione matInsert.
4 (6.0 punti)
Si scriva una funzione ricorsiva in grado di generare tutte le stringhe di lunghezza N costituite dalle 5 vocali maiuscole
’A’, ’E’, ’I’, ’O’, ’U’. La funzione soddisfi inoltre i seguenti vincoli:
• Il valore di N sia ricevuto dal programma sulla riga di comando e sia N ≥ 5.
• Nella stringa generata ogni vocale compaia almeno una volta.
La funzione ricorsiva deve essere tale per cui all’i-esimo livello di ricorsione viene gestito l’i-esima cella della stringa della
soluzione.