Algoritmi e Sperimentazioni a.a. 2006/2007 COMPITO 3 (2 Luglio

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