Algoritmi e Programmazione Avanzata Compito d’esame dell’ 28 aprile 2003 Prova di Teoria N.B. Indicare nell’elaborato (oltre a nome, cognome e numero di matricola) anche IL CORSO DI LAUREA (INF1: Ing. Informatica I corso; INF2: Ing. Informatica II corso; TLC: Ing. delle Telecomunicazioni; AUT: Ing. dell’Automazione; IFM: Ing. dell’Informazione e LIFI). 1 (2 punti) Sia data la sequenza di interi, supposta memorizzata in un vettore: 1 10 14 27 0 17 55 8 41 19 91 23 37 31 7 12 3 Si costruisca lo heap ad essa corrispondente. Si utilizzi un vettore come struttura dati. Si riportino graficamente i passi significativi della costruzione dello heap ed il risultato finale. Si ipotizzi che, alla fine, nella radice dello heap sia memorizzato il valore massimo. 2 (1 punto) Si ordini in maniera ascendente mediante counting-sort il seguente vettore di interi: 9 3 8 3 7 5 3 6 3 4 2 9 9 7 8 Si indichino i passaggi rilevanti. 3 (2 punti) Si effettuino secondo l’ordine specificato le seguenti operazioni su un BST supposto inizialmente vuoto (+ indica una inserzione, una cancellazione): +22 +13 +11 +5 +37 +19 +26 +1 +4 -22 +8 -13 4 (2 punti) Sia data la sequenza di chiavi PRIMAVERA, dove ciascun carattere è individuato dal suo ordine progressivo nell’alfabeto (A=1, ..., Z=26). Si riporti la struttura di una tabella di hash di dimensione 19, inizialmente supposta vuota, in cui avvenga l’inserimento della sequenza di cui sopra. Si supponga di utilizzare l’open addressing con double hashing scegliendo opportunamente la funzione di hash. 5 Sia dato il seguente grafo orientato in figura: a b c d f g 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à, etichettando i vertici con i tempi di scoperta e di fine elaborazione nel formato tempo1/tempo2 (1.5 punti) lo si ridisegni, etichettando gli archi come T (tree), B (back), F (forward), C (cross) (0.5 punti) se ne effettui una visita in ampiezza, ritornando come risultato l’albero della visita in ampiezza (2 punti). Qualora necessario, si trattino i vertici secondo l’ordine alfabetico. 6 (3 punti) Sia dato il seguente grafo orientato pesato. Si determinino i valori di tutti i cammini minimi che collegano il vertice a con ogni altro vertice mediante l’algoritmo di Dijkstra. Si assuma, qualora necessario, un ordine alfabetico per i vertici e gli archi. 1 a b 2 2 1 c 3 d h 4 1 3 2 f 1 4 2 g Algoritmi e Programmazione Avanzata Compito d’esame dell’ 28 aprile 2003 Prova di Programmazione N.B. Indicare nell’elaborato e nella relazione (oltre a nome, cognome e numero di matricola) anche IL CORSO DI LAUREA (INF1: Ing. Informatica I corso; INF2: Ing. Informatica II corso; TLC: Ing. delle Telecomunicazioni; AUT: Ing. dell’Automazione; IFM: Ing. dell’Informazione e LIFI). Consegna relazioni (per tutti i corsi): entro lunedì 05 maggio, ore 10.30, segreteria studenti dipartimenti elettrici, piano semi-interrato. Si scriva un programma in linguaggio C che realizzi una variante del gioco del “domino”. In tale gioco un dato numero di pezzi deve essere posto in sequenza in modo da avere a contatto estremi con lo stesso valore numerico (per esempio 3-2, 2-5, 5-6). Il programma in questione, di nome domino, deve essere eseguito con tre argomenti sulla riga di comando: domino <nomeFileIn> <numeroPezzo> <nomeFileOut> (in alternativa i tre dati possono essere acquisiti da tastiera). Il file di nome <nomeFileIn> contiene l’elenco dei pezzi del domino. Ciascuna riga del file ha il seguente formato: <nPezzo> <n1>-<n2> e indica un pezzo del domino essendo: <nPezzo> un numero intero che individua il numero del pezzo del domino <n1> e <n2> i numeri dei due estremi del pezzo del domino. Essi possono assumere valori interi compresi tra 0 e 9. Si noti che sono possibili ripetizioni (pezzi uguali). <numeroPezzo> è il numero del pezzo (<nPezzo> nel file) da cui partire per realizzare la catena desiderata: il programma deve rintracciare la sequenza più lunga possibile (ovvero quella contenente il numero maggiore di pezzi selezionati tra quelli presenti nel file) partendo da tale pezzo. Si osservi che ciascun pezzo può essere disposto nella sequenza in entrambi i “sensi” (per esempio 2-3 oppure 3-2). <nomeFileOut> è il file creato dal programma e riporta sulla prima riga la lunghezza della catena (il numero di pezzi del domino che la formano) e, sulle righe successive, l’elenco dei pezzi utilizzati, con lo stesso formato del file <nomeFileIn>. Esempio Sia il comando fornito dall’utente il seguente: domino a.txt 4 b.txt e sia a.txt il seguente file: 2 5 3 4 1 1-2 9-9 5-2 2-3 6-5 La catena più lunga è la seguente: 3-2, 2-5, 5-6 Occorre quindi generare il seguente file b.txt: 3 4 3-2 3 2-5 1 5-2