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