• Non ci sono risultati.

Per un buon esito dell’esame, si consiglia di:

N/A
N/A
Protected

Academic year: 2021

Condividi "Per un buon esito dell’esame, si consiglia di:"

Copied!
6
0
0

Testo completo

(1)

Esame di Algoritmi e Strutture di Dati (A) Marted`ı 7 Gennaio 2003

Nome:

Cognome:

Matricola:

Per un buon esito dell’esame, si consiglia di:

scrivere in forma leggibile il proprio nome, cognome e matricola sul testo del compito e su ogni foglio consegnato;

provare gli esercizi prima in brutta copia. Ricopiarli in bella copia e consegnare quest’ultima oltre al testo del compito;

non fatevi prendere dal panico, e neppure dalla noia. Un giusto livello di tensione ` e ci` o che serve;

svolgere il compito individualmente. Passare copiando ` e dannoso per voi, e irrilevante per il docente.

Esercizio 1 (Punti 20)

Due insiemi si dicono disgiunti se non posseggono elementi in comune. Ideare una struttura di dati per rappresentare insiemi che permetta di implementare l’oper- azione di unione tra insiemi disgiunti con complessit`a pessima costante Θ(1). Scri- vere lo pseudocodice della procedura di complessit`a costante che implementa l’unione disgiunta.

Soluzione

Rappresento un insieme mediante una lista circolare (il predecessore della testa `e

la coda, e il successore della coda `e la testa). Ogni elemento della lista contiene un

elemento dell’insieme. Date due liste circolari L e M che contengono insiemi disgiunti,

la seguente procedura DisjointU nion(L, M ) ritorna un puntatore alla lista che con-

tiene l’unione disgiunta degli insiemi contenuti in L e M . La procedura semplicemente

concatena la lista M alla fine della lista L. Il costo della procedura `e costante.

(2)

Algoritmo 1 DisjointUnion(L,M) DisjointUnion(L,M)

1:

if ListEmpty(L) then

2:

return head(M )

3:

end if

4:

if ListEmpty(M ) then

5:

return head(L)

6:

end if

7:

y ← prev[head(L)]

8:

z ← prev[head(M )]

9:

next[y] ← head(M )

10:

prev[head(M )] ← y

11:

prev[head(L)] ← z

12:

next[z] ← head(L)

13:

return head(L)

Esercizio 2 (Punti 10)

Sia A un vettore. Si consideri la seguente procedura di ordinamento T reeSort(A).

La procedura consiste di due passi:

1. gli elementi di A vengono inseriti in un albero binario di ricerca T usando la procedura T reeInsert;

2. l’albero T viene visitato in ordine intermedio e gli elementi di T vengono inseriti nel vettore A.

Si calcoli la complessit`a ottima, media e pessima di T reeSort.

Soluzione

Sia n la lunghezza di A. Nel caso pessimo, l’albero T risultante dopo gli n in- serimenti degli elementi di A `e una sequenza. In tal caso, dopo i inserimenti, con 1 ≤ i ≤ n, l’altezza dell’albero corrente `e pari a i. La complessit`a di T reeInsert `e dell’ordine dell’altezza dell’albero in cui il nodo viene inserito. Dunque la complessit`a dell’inserimento degli n elementi di A nell’albero T `e pari a

X

n i=1

Θ(i) = Θ(

X

n i=1

i) = Θ(n(n + 1)/2) = Θ(n

2

).

La complessit`a pessima della visita intermedia di T `e Θ(n). Dunque la complessit`a pessima di T reeSort risulta Θ(n

2

+ n) = Θ(n

2

).

Nel caso ottimo, l’albero T risultante dopo gli n inserimenti degli elementi di A

`e un albero completo fino al penultimo livello. In tal caso, dopo i inserimenti, con 1 ≤ i ≤ n, l’altezza dell’albero corrente `e pari a blog ic. La complessit`a di T reeInsert `e dell’ordine dell’altezza dell’albero in cui il nodo viene inserito. Dunque la complessit`a dell’inserimento degli n elementi di A nell’albero T `e pari a

X

n i=1

Θ(log i) = Θ(

X

n i=1

log i) = Θ(log Y

n i=1

i) = Θ(log n!) = Θ(n log n).

(3)

La complessit`a ottima della visita intermedia di T `e Θ(n). Dunque la complessit`a ottima di T reeSort risulta Θ(n log n + n) = Θ(n log n).

Nel caso medio, l’albero T risultante dopo gli n inserimenti degli elementi di A `e un

albero bilanciato con altezza logaritmica nel numero dei nodi. Dunque la complessit`a

media `e pari alla complessit`a ottima, cio`e Θ(n log n).

(4)

Esame di Algoritmi e Strutture di Dati (B) Marted`ı 7 Gennaio 2003

Nome:

Cognome:

Matricola:

Per un buon esito dell’esame, si consiglia di:

scrivere in forma leggibile il proprio nome, cognome e matricola sul testo del compito e su ogni foglio consegnato;

provare gli esercizi prima in brutta copia. Ricopiarli in bella copia e consegnare solo quest’ultima;

non fatevi prendere dal panico, e neppure dalla noia. Un giusto livello di tensione ` e ci` o che serve;

svolgere il compito individualmente. Passare copiando ` e dannoso per voi, e irrilevante per il docente.

Esercizio 3 (Punti 20)

Due insiemi si dicono disgiunti se non posseggono elementi in comune. Ideare una struttura di dati per rappresentare insiemi che permetta di implementare l’oper- azione di unione tra insiemi disgiunti con complessit`a pessima costante Θ(1). Scri- vere lo pseudocodice della procedura di complessit`a costante che implementa l’unione disgiunta.

Soluzione

Rappresento un insieme mediante una lista circolare (il predecessore della testa `e

la coda, e il successore della coda `e la testa). Ogni elemento della lista contiene un

elemento dell’insieme. Date due liste circolari L e M che contengono insiemi disgiunti,

la seguente procedura DisjointU nion(L, M ) ritorna un puntatore alla lista che con-

tiene l’unione disgiunta degli insiemi contenuti in L e M . La procedura semplicemente

concatena la lista M alla fine della lista L. Il costo della procedura `e costante.

(5)

Algoritmo 2 DisjointUnion(L,M) DisjointUnion(L,M)

1:

if ListEmpty(L) then

2:

return head(M )

3:

end if

4:

if ListEmpty(M ) then

5:

return head(L)

6:

end if

7:

y ← prev[head(L)]

8:

z ← prev[head(M )]

9:

next[y] ← head(M )

10:

prev[head(M )] ← y

11:

prev[head(L)] ← z

12:

next[z] ← head(L)

13:

return head(L)

Esercizio 4 (Punti 10)

Sia A un vettore. Si consideri la seguente procedura di ordinamento T reeSort(A).

La procedura consiste di due passi:

1. gli elementi di A vengono inseriti in un albero binario di ricerca T usando la procedura T reeInsert;

2. l’albero T viene visitato in ordine intermedio e gli elementi di T vengono inseriti nel vettore A.

Si calcoli la complessit`a ottima, media e pessima di T reeSort.

Soluzione

Sia n la lunghezza di A. Nel caso pessimo, l’albero T risultante dopo gli n in- serimenti degli elementi di A `e una sequenza. In tal caso, dopo i inserimenti, con 1 ≤ i ≤ n, l’altezza dell’albero corrente `e pari a i. La complessit`a di T reeInsert `e dell’ordine dell’altezza dell’albero in cui il nodo viene inserito. Dunque la complessit`a dell’inserimento degli n elementi di A nell’albero T `e pari a

X

n i=1

Θ(i) = Θ(

X

n i=1

i) = Θ(n(n + 1)/2) = Θ(n

2

).

La complessit`a pessima della visita intermedia di T `e Θ(n). Dunque la complessit`a pessima di T reeSort risulta Θ(n

2

+ n) = Θ(n

2

).

Nel caso ottimo, l’albero T risultante dopo gli n inserimenti degli elementi di A

`e un albero completo fino al penultimo livello. In tal caso, dopo i inserimenti, con 1 ≤ i ≤ n, l’altezza dell’albero corrente `e pari a blog ic. La complessit`a di T reeInsert `e dell’ordine dell’altezza dell’albero in cui il nodo viene inserito. Dunque la complessit`a dell’inserimento degli n elementi di A nell’albero T `e pari a

X

n i=1

Θ(log i) = Θ(

X

n i=1

log i) = Θ(log Y

n i=1

i) = Θ(log n!) = Θ(n log n).

(6)

La complessit`a ottima della visita intermedia di T `e Θ(n). Dunque la complessit`a ottima di T reeSort risulta Θ(n log n + n) = Θ(n log n).

Nel caso medio, l’albero T risultante dopo gli n inserimenti degli elementi di A `e un

albero bilanciato con altezza logaritmica nel numero dei nodi. Dunque la complessit`a

media `e pari alla complessit`a ottima, cio`e Θ(n log n).

Riferimenti

Documenti correlati

[r]

scrivere in forma leggibile il proprio nome, cognome e matricola sul testo del compito e su ogni foglio consegnato;.. provare gli esercizi prima in

L’operazione di forward shift su una sequenza sposta ogni elemento della sequenza di una posizione in avanti in modo circolare (quindi l’ultimo elemento viene spostato in

[r]

ogni singolo oggetto pu`o essere coinvolto in al pi`u blog nc (per via del raddoppiamento), quindi un totale di O(n log n) crediti `e sufficiente a pagare qualunque sequenza di

Questo equivale a dire che occorre di- mostrare formalmente che il massimo ` e sempre il primo elemento della lista.. Mos- triamo una bozza di dimostrazione

(b) Calcolare la percentuale di ore che ogni progetto ha dedicato ai vari tipi di attivit` a rispetto al totale di ogni progetto, la percentuale di ore di ogni Work Package rispetto

Infatti se si volesse risolvere la partizione in questo modo si avrebbe un algoritmo di complessit` a O(2 n n) che non sarebbe polinomiale nemmeno con la codifica unaria.. Infatti