La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.

Slides:



Advertisements
Presentazioni simili
Problema dellordinamento Input: Sequenza di n numeri Output: Permutazione π = tale che: a 1 a 2 …… a n Subroutine in molti problemi E possibile effettuare.
Advertisements

Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
                      Insertion-Sort
RB-alberi (Red-Black trees)
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Alberi binari di ricerca
Code con priorità Ordinamento
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Algoritmo di Ford-Fulkerson
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Usa la tecnica del.
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Algoritmi di ordinamento
Heap binari e HeapSort.
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
COMPLESSITÀ DEGLI ALGORITMI
Metodo della moltiplicazione
Elementi di Informatica di base
Ordinamento dell’array
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Radix-Sort(A,d) // A[i] = cd...c2c1
Didattica dei Fondamenti dell’Informatica 2 Seconda giornata: progettare un algoritmo corretto, efficiente, e possibilmente ottimo! Guido Proietti
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Radice quadrata di un numero
Algoritmi di Ordinamento
Valutare la difficoltà dei problemi
1/32 Algoritmi e Strutture Dati HEAP Anno accademico
Complessità del problema Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni. Problema.
Algoritmi e Strutture Dati Luciano Gualà
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.
Soluzione 6: Algoritmo Quicksort
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
1 Ordinamento (Sorting) INPUT: Sequenza di n numeri OUTPUT: Permutazione π = tale che a 1 ’  a 2 ’  … …  a n ’ Continuiamo a discutere il problema dell’ordinamento:
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Analisi ammortizzata Si considera il tempo richiesto per eseguire, nel caso pessimo, una intera sequenza di operazioni. Se le operazioni costose sono.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quinta giornata Risolvere efficientemente un problema in P: ancora sulla sequenza di Fibonacci.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Sesta giornata Risolvere efficientemente un problema in P: Il problema dell’ordinamento: Insertion.
GLI ALGORITMI DI ORDINAMENTO
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Ordinamento in tempo lineare
Transcript della presentazione:

La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni pratiche questo non è vero!!! Vi sono applicazioni in cui le permutazioni quasi ordinate sono molto più probabili e questo può aumentare la complessità media fino ad O(n2).

Randomized-Partition(A,p,r) i = Random(p,r) scambia A[i] e A[r] return Partition(A,p,r) Randomized-Quicksort(A,p,r) if p < r then q = Randomized-Partition(A,p,r) Randomized-Quicksort(A,p,q-1) Randomized-Quicksort(A,q+1,r)

Complessità del problema Problema dell’ordinamento Input: sequenza a1,a2,...,an di elementi su cui è definito un ordine Output: a'1,a'2,...,a'n permutazione di a1,a2,...,an tale che a'1 ≤ a'2 ≤ ... ≤ a'n Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni.

Siccome siamo interessati ad un limite inferiore possiamo contare solo alcune delle operazioni. Se un certo limite inferiore vale per il tempo richiesto per eseguire tali operazioni a maggior ragione varrà per il tempo calcolo totale. Noi conteremo solo i confronti e dimostreremo che nel caso pessimo il numero di confronti è Ω(n log n). Per fare questo è utile rappresentare la struttura di un algoritmo mediante un albero delle decisioni.

1:2 ≤ > 2:3 2:3 ≤ > ≤ > 1:2 1:2 ≤ > > ≤ Esempio. Albero delle decisioni di Insertion-Sort con un array di 3 elementi. Insertion-Sort(A) n = A.length for j = 2 to n i = j – 1 while i ≥ 1 and A[i]>A[i+1] scambia A[i] con A[i+1] i = i – 1 1:2 ≤ > 2:3 2:3 ≤ > ≤ > 1:2 1:2 ≤ > > ≤

Per dimostrare il limite inferiore etichettiamo l’albero delle decisioni nel seguente modo: - la radice è etichettata con la sequenza in input a1,a2,...,an (che per semplicità assumiamo sia una permutazione di 1,2,...,n). - le foglie sono etichettate con la sequenza risultato che deve essere una permutazione ordinata di a1,a2,...,an; nel nostro caso la sequenza 1,2,...,n.

1:2 a,b,c 2:3 a,b,c 2:3 b,a,c 1:2 a,c,b 1:2 b,c,a Esempio. Albero delle decisioni di Insertion-Sort con un array di 3 elementi. 1:2 a,b,c ≤ > 2:3 a,b,c 2:3 b,a,c ≤ > ≤ > 1:2 a,c,b 1:2 b,c,a a,b,c (1,2,3) b,a,c (1,2,3) ≤ > > ≤ a,c,b (1,2,3) c,a,b (1,2,3) b,c,a (1,2,3) c,b,a (1,2,3) Se l’algoritmo è corretto a permutazioni distinte in input devono corrispondere cammini distinti nell’albero. Perché?

Le permutazioni di 1,2,. ,n sono n Le permutazioni di 1,2,...,n sono n! e quindi l’albero delle decisioni deve avere almeno n! foglie. Ma un albero binario con N foglie deve avere altezza almeno pari a log2(N). Esercizio: Dimostrarlo per induzione su N. Dunque nel caso pessimo l’algoritmo deve eseguire almeno log2(n!) confronti.

Ma e quindi per ogni algoritmo generale di ordinamento. Possiamo concludere che Ω(n log n) è un limite inferiore per la complessità del problema dell’ordinamento.

L’algoritmo di ordinamento Heapsort risolve il problema dell’ordinamento con complessità massima Dunque O(n log n) è limite superiore per la complessità del problema dell’ordinamento. Siccome limite superiore e inferiore coincidono (n log n) è limite stretto per il problema dell’ordinamento.

Considerazione sul limite inferiore Ω(n log n) per l’ordinamento ATTENZIONE: Il limite inferiore Ω(n log n) da noi dimostrato vale solo per algoritmi di ordinamento generali, ossia algoritmi che non fanno alcuna ipotesi sul tipo degli elementi da ordinare: le uniche operazioni ammesse su tali elementi sono confronti e assegnazioni.

Il limite inferiore Ω(n log n) vale anche per ordinare numeri reali sui quali, oltre a confronti ed assegnazioni, si possono usare anche le quattro operazioni aritmetiche. In questo caso la dimostrazione del limite inferiore è molto più difficile e si basa su alcuni risultati di geometria algebrica. La dimostrazione si può trovare nel testo di Geometria Computazionale di F. Preparata.

Possiamo usare il limite Ω(n log n) per l’ordinamento per dimostrare limiti inferiori per altri problemi. La tecnica che si usa è quella della riduzione dei problemi. Illustriamo questa tecnica con un esempio.

Il problema dell’involucro convesso: “Dati n punti del piano trovare il più piccolo poligono convesso che li contiene tutti” q4 q2 q1 q7 q5 q8 q6 q9 q3 pi Input: p1,…,pn in ordine qualsiasi Output: q1,…,qm in ordine antiorario

Sia Alg un algoritmo qualsiasi che risolve il problema dell’involucro convesso. Lo possiamo utilizzare per ordinare una sequenza a1,a2,...,an di numeri reali nel modo seguente :

A = (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) P = (p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) p1 a1 a12 q7 q8 q5 q4 q3 q2 q1 q10 q9 q6 x8 Q = (q1, q2, q3, q4, q5, q6, q7, q8, q9, q10) A = (x8, x9, x10, x1, x2, x3, x4, x5, x6, x7)

Costruiamo i punti p1,p2,...,pn di coordinate pi  (ai , ai2 ) Tempo Θ(n). Usiamo Alg per trovare l’involucro convesso q1,q2,...,qn Tempo TAlg(n). Cerchiamo qk con coordinata x minima Tempo Θ(n). Prendiamo le coordinate x dei punti q1,q2,...,qn nell’ordine xk, ... ,xn,x1, ... ,xk-1 Tempo Θ(n).

Abbiamo un algoritmo di ordinamento di complessità Se Alg avesse complessità massima inferiore a (n log n) potremmo ordinare un array di reali in tempo inferiore a (n log n). Questo è impossibile a causa del limite inferiore Ω(n log n) per il problema dell’ordinamento. Quindi Ω(n log n) è limite inferiore anche per il problema dell’involucro convesso.

Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna ipotesi sul tipo degli elementi della sequenza da ordinare. Se facciamo opportune ipotesi restrittive sul tipo degli elementi possiamo trovare algoritmi più efficienti. Naturalmente il limite inferiore banale Ω(n) vale comunque per tutti gli algoritmi di ordinamento.

Algoritmo Counting-Sort Assume che gli elementi dell’array siano interi compresi tra 0 e k con k costante. Per ordinare un array A Counting-Sort richiede un secondo array B in cui mette la sequenza ordinata e un array ausiliario C[0..k].

1 2 3 4 5 6 7 8 A 1 4 2 1 2 2 C 2 3 1 4 C 2 4 7 8 1 3 1 3 2 5 4 6 7 B 1 2 3 4 5 6 7 8 1 1 2 2 2 4

Counting-Sort(A,B,k) // A contiene a1,...,an for i = 0 to k C[i] = 0 for j = 1 to A.length x = A[j], C[x] = C[x] + 1 // C[x] è il numero di elementi aj = x for i = 1 to k C[i] = C[i] + C[i-1] // C[x] è il numero di elementi aj ≤ x for j = A.length downto 1 // i = C[x] è la posizione in B dove // mettere il prossimo aj = x x = A[j], i = C[x], B[i] = x C[x] = C[x] - 1

Complessità: TCS(n,k) = (n+k) Counting-Sort(A,B,k) // Complessità for i = 0 to k // C[i] = 0 // for j = 1 to A.length // x = A[j], C[x] = C[x] + 1 // for i = 1 to k // C[i] = C[i] + C[i-1] // for j = A.length downto 1 // x = A[j], i = C[x], B[i] = A[j] // C[x] = C[x] - 1 // Complessità: TCS(n,k) = (n+k) Se k = O(n) allora TCS(n,k) = (n)

Osservazione: Nell’ultimo ciclo for dell’algoritmo gli elementi dell’array A vengono copiati nell’array B partendo dall’ultimo Cosa succede se partiamo dal primo?

A 1 4 2 1' 2' 0' 2" 3 5 6 7 8 C 2 4 7 8 1 3 1 3 6 7 B 1 2 3 4 5 6 7 8 1' 1 2 4

Succede che l’algoritmo è ancora corretto ma gli elementi uguali vengono ricopiati in ordine inverso. Quando un algoritmo di ordinamento mantiene l’ordine iniziale tra due elementi uguali si dice che esso è stabile. L’algoritmo Counting-Sort (con l’ultimo ciclo for decrescente) è stabile.

Algoritmo Radix-Sort Assume che i valori degli elementi dell’array siano interi rappresentabili con al più d cifre in una certa base b. Ad esempio interi di d = 5 cifre decimali (b = 10), interi di d = 4 byte (cifre in base b = 256) o stringhe di d caratteri (b = 256). Per ordinare l’array si usa d volte un algoritmo di ordinamento stabile (ad esempio Counting-Sort) per ordinare l’array rispetto a ciascuna delle d cifre partendo dalla meno significativa.

4 3 2 1 7 5 6 9 8 4 3 2 1 7 5 6 9 8 4 3 2 1 7 5 6 9 8 4 3 2 1 7 5 6 9 8 4 3 2 1 7 5 6 9 8 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]