13 Novembre 2003

annuncio pubblicitario
Nome:
Matricola:
Cognome:
Firma:
ID(max 8 caratteri):
Università di Salerno
Dip. Informatica ed Appl.
13 Novembre 2003-Aula C38
Algoritmi e Strutture Dati (matricole Pari-Dispari)
Docente: Giuseppe Persiano
Durata: 2 ore
Nessun materiale ammesso per consultazione. Buon lavoro a tutti.
Il presente esame consiste di 4 pagine e 5 quesiti. Segnalare qualsiasi discrepanza alla
commissione. Il numero in parentesi all’inizio di ciascun quesito corrisponde al numero di
punti assegnati ad una risposta corretta.
Rispondere a tutti i quesiti.
pagina 2
1. [20] Descrivere ed analizzare un algoritmo deterministico lineare per il calcolo della
mediana.
Soluzione. Vedi pagina 189-191 del Capitolo 9 del libro di testo.
2. [20] Definere il problema della mediana pesata e descrivere mediante pseudocodice ed
analizzare un algoritmo lineare per il calcolo della mediana pesata.
Soluzione. Siano dati una sequenza X = (x1 , · · · , xn ) di n interi positivi distinti e una
P
sequenza di pesi positivi W = (w1 , · · · , wn ) tali che i wi = 1. Definiamo la mediana
pesata della sequenza X rispetto a i pesi W come l’elemento x di X tale che
X
i:xi <x
e
wi <
1
2
1
wi ≤ .
2
i:xi >x
X
Il problema della mediana pesata consiste nel calcolare la mediana pesata di una data
sequenza X rispetto ad una data sequenza di pesi. La mediana pesata può essere
calcolata in tempo Θ(n log n) dal seguente algoritmo.
MedianaPesataConSorting(X, W )
1. sia Y = (y1 , · · · , yn ) la sequenza ottenuta ordinando X e
sia Z = (z1 , · · · , zn ) la corrispondente sequenza di pesi;
2. l = 0; r = 1 − z1 ; i = 1;
3. while ( l ≥ 1/2 or r > 1/2)
4.
l = l + zi ; r = r − wi+1 ; i = i + 1;
5. return yi ;
Ad esempio, consideriamo le sequenze X = (3, 1, 7, 5) con pesi W = (.1, .2, .3, .4). La
sequenza Y calcolata la passo 1. dall’algoritmo è (1, 3, 5, 7) e la relativa sequenza di
pesi è Z = (.2, .1, .4, .3). L’algoritmo si ferma con i = 3 e restituisce 5.
Il quesito chiedeva invece un algoritmo lineare. Consideriamo pertanto il seguente
algoritmo.
MedianaPesataSenzaSorting(X, W, a, b)
1. calcola la mediana x dell’insieme X;
2. calcola gli insiemi Xl e Xr contenenti, rispettivamente, gli elementi minori e
maggiori di x;
siano Wl e Wr le sequenze dei pesi delle sequenze Xl e Xr ;
siano wl e wr i pesi degli elementi in Xl e Xr ;
pagina 3
3.
4.
5.
6.
7.
8.
if wl + a < 1/2 e wr + b ≤ 1/2 then
return x;
if wl + a ≥ 1/2 then
return MedianaPesataSenzaSorting(Xl , Wl , a, b + wr )
if wb + b > 1/2 then
return MedianaPesataSenzaSorting(Xr , Wr , a + wl , b)
Per calcolare la mediana pesata di X rispetto a W , basta invocare l’algoritmo passando
(X, W, 0, 0) come argomenti.
La correttezza può essere provata osservando che l’algoritmo mantiene la seguente
invariante. Per ogni invocazione MedianaPesataSenzaSorting(A, Z, a, b) su un
sottoinsieme A di X con sequenza di pesi Z, il peso degli elementi di X minori di tutti
gli elementi di A è a mentre il peso degli elementi di X maggiori di tutti gli elementi
di A è b.
L’algoritmo prende tempo O(n). Infatti, denotiamo con T (n) il numero di passi
dell’algortimo su input una sequenza di lunghezza n. Allora abbiamo che, siccome
i passi 1 e 2, prendono tempo Θ(n) e poiché ad ogni passo la lunghezza della sequenza
si dimezza,
T (n) = T (n/2) + Θ(n)
da cui, per il Master Theorem sulle ricorrenza, deriva T (n) = O(n)
3. [20] Descrivere un algoritmo lineare che, ricevendo in input un insieme S di n interi ed
un intero k ≤ n, dà in output i k interi più vicini in valore alla mediana.
Soluzione. Il seguente algoritmo prende tempo lineare.
1.
2.
3.
4.
calcola la mediana x dell’insieme S;
calcola la sequenza D dei valori assoluti delle differenze tra gli elementi di S e x;
in altre parole, di = |x − si |;
calcola la k-esima order statistics l di D;
per ogni elemento di di D minore o uguale a l dai in output si ;
4. [20] Descrivere un algoritmo che in tempo O(n log k) effettua il merge di k liste ordinate
che contengono un totale di n elementi.
Soluzione. Si costruisca una coda a priorità S contenente all’inizio i massimi di ciascuna lista. Più precisamente, S contiene dei record (x, i) ove x è un elemento della
lista e i è la lista di provenienza. La proprietà delle code a priorità vale sul campo x
dei record.
Eseguiamo i seguenti passi fintanto che almeno una delle liste è non vuota. Estraiamo
il massimo record (M, i) da C. Diamo M in output. Se la i-esima lista non è vuota
aggiungiamo a C il prossimo elemento dell’i-esima lista.
pagina 4
Ogni passo dell’algortimo comporta l’estrazione del massimo e l’inserimento di un elemento su una lista a priorità che contiene al più k elementi. Pertanto ogni iterazione prende tempo O(log k). L’algoritmo effettua n iterazioni e quindi prende tempo
O(n log k).
5. [20] Calcolare come funzione di n il tempo di esecuzione di Quicksort quando riceve in
input una sequenza di n elementi distinti ordinati in ordine crescente e quando riceve
in input una sequenza di n elementi uguali.
Soluzione. Supponiamo invece che gli elementi siano tutti distinti e ordinati in ordine
crescente. In questo caso il primo ciclo repeat su j termina con j = p. Pertanto
Partition restituisce il j = p. Quindi QuickSort su un array di n elementi genera
una chiamata ricorsiva su un array di grandezza 1 e una chiamanta su un array di n − 1
elementi distinti ordinati in ordine crescente per un running itme di Θ(n2 ).
Se gli elementi dell’array A sono tutti uguali, allora i cicli repeat su i e su j terminano
esattamente dopo una iterazione. Alla fine della k-esima iterazione del ciclo while, i
ha valore p + k − 1 e j ha valore r − k + 1. Pertanto j diverrà minore o uguale a i
all’iterazione
r−p+2
.
2
Quindi se l’array da ordinare ha n elementi, QuickSort sarà chiamato ricorsivamente
su un array di b n+1
c = d n2 e ed un array di b n2 c. Il running time sarà quindi θ(n log n).
2
Fine dell’esame
Pagine totali: 4
Punti totali: 100
Scarica