Algoritmi e Sperimentazioni a.a. 2006/2007 COMPITO 3 (2 Luglio 2007) – foglio 1 di 2 COGNOME ………………………. NOME ………..……………… Matr. n. …………………. 1. (PUNTI 1+1+1) Si consideri la specifica di correttezza: p1-in(A,B) : (A[0.. A.length-1] array di interi >= 0, con A.length >= 1 elementi ) & ( B[0.. B.length-1] array di booleani , con B.length = A[0]+A[A.length-1]) p1-out(A,B,C) : ( per ogni i in 0..min(A.length,B.length)-1, C[i] = ( B[i] AND ( A[i] >= (1-A[i]) ) ) e la specifica di correttezza: p1-in(A,B) : (A[0.. A.length-1] array di interi > 0, con A.length >= 1 elementi ) & ( B[0.. B.length-1] array di booleani, con B.length = A[0]+A[A.length-1]) p1-out(A,B,C) : ( per ogni i in 1..min(A.length,B.length)-1, C[i] = B[i] ) a) Scrivere un programma (in pseudo-codice) che sia totalmente corretto rispetto ad entrambe le specifiche. b) E’ possibile scrivere un programma che sia totalmente corretto rispetto alla prima specifica e non totalmente corretto rispetto alla seconda specifica? (SE SI, esibire tale programma. SE NO, motivare la risposta.) c) E’ possibile scrivere un programma che sia totalmente corretto rispetto alla seconda specifica e non totalmente corretto rispetto alla prima specifica? (SE SI, esibire tale programma. SE NO, motivare la risposta.) 2. (PUNTI 2) Completare il seguente algoritmo con l’asserzione finale e l’invariante di ciclo che permettono di dimostrarne la correttezza. {A.I.: A.length ≥ 1 & A[0..A.length-1] contiene numeri interi & x contiene un booleano} r ← A[A.length – 1] ; i ← A.length-2 ; {I.C.:……………………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………………………… } while i >= 0 and (not x) do if x then r ← r + A[i] else r ← r * A[i] endif i ← i-1; enddo return r; {A.F.:………………………………………………………………………………………………………………………………………………………} 3. (PUNTI 1+1+1+1) a) Fornire l’algoritmo Greedy-Activity-Selector e dire se e’ istanza dello schema generale 1 oppure dello schema generale 2 di algoritmo greedy. b) Scrivere lo schema generale 1 e lo schema generale 2 di algoritmo greedy. c) Applicare l'algoritmo Greedy-Activity-Selector al seguente insieme di attività, di cui sono forniti gli intervalli di attività [s, f). s f A 7 13 B 3 6 C 4 8 D 7 9 E 4 12 F 7 11 G 3 10 H 2 3 d) L’insieme di attivita’ fornito al punto c) ammette un solo insieme massimale di attivita’ mutuamente compatibili ? (MOTIVARE LA RISPOSTA) 4. (PUNTI 2+2) a) Descrivere (in linguaggio naturale) l’algoritmo “bucket sort”. b) Simulare l’esecuzione dell’algoritmo descritto al punto precedente per ordinare, rispetto al campo matricola (che puo’ contenere solo interi di valore compreso nell’intervallo 1..7), la lista dei seguenti 6 oggetti: (matricola=5, nome= “Pippo”, cognome = “”) (matricola=2, nome= “Qui”, cognome = “”) (matricola=7, nome= “Paolino”, cognome = “Paperino”) (matricola=5, nome= “Pippo”, cognome = “”) (matricola=3, nome= “Paperone”, cognome = “de’Paperoni”) (matricola=1, nome= “Gastone”, cognome = “Fortunato”) 5. (PUNTI 3 + 1 + 2) a) Scrivere un algoritmo Divide-et-Impera che risolva il seguente problema: Dati un array A di A.length >= 0 numeri interi e un array B di B.length >= 0 booleani (entrambi con con indici che partono da 0), restituire la somma dei numeri contenuti nell’insieme: { A[i]*A[i] | ( 0 <= i < min(A.length,B.length) ) AND (NOT B[i]) } b) Fornire la complessita’ computazione in tempo e la complessita’ computazionale in spazio dell’algoritmo usando il criterio di costo uniforme. c) Fornire la complessita’ computazione in tempo e la complessita’ computazionale in spazio dell’algoritmo usando il criterio di costo logaritmico. COMPITO 3 (2 Luglio 2007) – foglio 2 di 2 COGNOME ………………………. 6. NOME ………..……………… Matr. n. ………………….. (PUNTI 2 + 2 + 2) a) Definire che cos'è un "ordinamento topologico" di un grafo orientato. ……………………………………………………………………………………………... ……………………………………………………………………………………………... ……………………………………………………………………………………………... b) Scrivere l'algoritmo "Topological_Sort" e completarlo con le asserzioni di input e di output. c) Individuare un ordinamento topologico del seguente grafo, 1 B 3 C H 1 3 2 1 2 4 E D 7 3 6 A 4 G 6 F simulando l’esecuzione dell'algoritmo Topological_Sort, nell'ipotesi che gli adiacenti siano memorizzati nelle liste di adiacenza in ordine alfabetico. 7. (PUNTI 4) Si scriva un algoritmo ricorsivo che, dato un grafo non orientato, effettui una visita in profondita’ di tutti i vertici di G e restituisca la lista dei nodi del grafo che, nella foresta generata dalla visita, non sono padri di almeno una foglia. 8. (PUNTI 5) Si consideri il seguente grafo: 1 B 3 C H 1 3 2 1 2 4 E D 7 3 6 A G 4 6 F a) Applicando l’algoritmo di Dijkstra si determinino i pesi dei cammini minimi che collegano il vertice A con tutti gli altri vertici. Nel seguito ci riferiremo all’albero dei cammini minimi restituito dall’algoritmo con il termine “soluzione”. Per svolgere correttamente l’esercizio si richiede di: i) Compilare le seguenti tabelle (la riga 0 è già compilata). La prima tabella indica, per ogni iterazione del ciclo esterno dell’algoritmo, per ogni vertice v che non appartiene alla soluzione (l’albero definitivo), la stima del peso di un cammino di peso minimo che collega il vertice A a tale vertice (∞ se un tale cammino non e‘ ancora stato trovato). Il valore di d non deve essere più riportato (si metta il simbolo -) quando il vertice e’ ormai parte della soluzione. La seconda tabella indica, per ogni iterazione del ciclo esterno, l'insieme dei vertici v che sono entrati a far parte della soluzione (per i quali d[v] è il peso del cammino minimo che collega il vetrice A al verice v). Le righe 0 corrispondono al temine dell’inizializzazione (prima di entrare nel ciclo). Quando nella coda con priorità ci sono vertici con lo stesso valore minimo di d si scelga quello che viene prima secondo l’ordine alfabetico. ii) Disegnare anche l’albero mantenuto dall’algoritmo (contente SIA gli archi che fanno parte della soluzione CHE gli archi candidati) al termine di ogni iterazione (cioe’ DOPO che sono state aggiornate le appetibilita’ dei vertici in coda). d 0 1 2 3 4 5 6 7 8 A B C D E F G H 0 ∞ ∞ ∞ ∞ ∞ ∞ ∞ Insieme dei vertici inclusi nella soluzione 0 {} 1 2 3 4 5 6 7 8