Algoritmi e Strutture Dati Capitolo 4 Lower bound Ω(n log n) per il problema dell’ordinamento (*)
Approfondimento: una terza variante dell’IS InsertionSort3 (array A) for k=1 to n-1 do x = A[k+1] j = ricerca_binaria(A[1,k],x) /* j è la posizione in cui andrà inserito x for i=k downto j do A[i+1] = A[i] A[j]=x rk ≤ log k in quanto ci si ferma non appena si trova un elemento pari ad x oppure x non viene trovato il tutto eseguito n-1 volte sk ≤ k spostamenti n-1 n-1 n-1 T(n) = (rk + sk) ≤ (log k +k ) ≤ 2k = O(n2) k=1 k=1 k=1 Copyright © 2004 - The McGraw - Hill Companies, srl
Una terza variante dell’IS (2) Caso peggiore: x andrà inserito in prima posizione, e quindi in tal caso rk = log k e sk = k, e quindi Tworst(n) = (log k +k) = Θ(n2) Caso migliore: si ha quando minimizzo rk + sk e quindi, intuitivamente, x andrà inserito “vicino” alla posizione k-esima. Quindi, la ricerca binaria deve spostarsi sempre verso destra. Ma se una tale ricerca binaria termina dopo t iterazioni, allora rk + sk = t+k/2t, e questa funzione è monotona descrescente per 1≤t≤log k, e quindi raggiunge il suo minimo per t=log k (cioè proprio quando x è maggiore di tutti gli elementi della sequenza). In tal caso rk=log k e sk=0, e quindi: Tbest(n) = log k = log (n-1)+…+ log 1 ≤ log n! ≤ log nn = n log n, cioè Tbest(n) = O(n log n), ma vale anche log (n-1) +…+ log 1 ≥ (prendo solo i primi (n-1)/2 termini) log ((n-1)/2)+…+ log ((n-1)/2) = (n-1)/2 log ((n-1)/2) = Ω(n log n), cioè Tbest(n) = Ω(n log n), e quindi Tbest(n) = Θ(n log n) n-1 k=1 n-1 k=1 Copyright © 2004 - The McGraw - Hill Companies, srl
Una terza variante dell’IS (3) Caso medio: la posizione attesa di x sarà quella mediana della sequenza, e quindi sk = k/2, da cui, senza nemmeno contare i confronti delle chiamate ricorsive Tavg(n) ≥ k/2 = Ω(n2) da cui, essendo chiaramente Tavg(n) = O(n2), ne consegue che Tavg(n) = Θ(n2). Quindi, ricapitolando, InsertionSort3 è meglio di InsertionSort1 ma peggio di InsertionSort2. n-1 k=1 Copyright © 2004 - The McGraw - Hill Companies, srl
Stato dell’arte sull’ordinamento Caso migliore Caso medio Caso peggiore T(n) S(n) Selection Sort Θ(n2) Θ(n2) Θ(n2) Θ(n2) Θ(n) Insertion Sort 1 Θ(n2) Θ(n2) Θ(n2) Θ(n2) Θ(n) Insertion Sort 2 Θ(n) Θ(n2) Θ(n2) O(n2) Θ(n) Insertion Sort 3 Θ(n log n) Θ(n2) Θ(n2) O(n2) Θ(n) Copyright © 2004 - The McGraw - Hill Companies, srl
Quindi, per il problema dell’ordinamento… Lower bound temporale: (n) “banale”: dimensione dell’input Upper bound temporale: O(n2) Insertion Sort 2 e 3 Abbiamo un gap lineare tra upper bound e lower bound! È possibile chiudere tale gap? Copyright © 2004 - The McGraw - Hill Companies, srl
Ordinamento per confronti Dati due elementi ai ed aj, per determinarne l’ordinamento relativo effettuiamo una delle seguenti operazioni di confronto: ai aj ; ai aj ; ai aj ; ai aj ; ai aj Non si possono esaminare i valori degli elementi o ottenere informazioni sul loro ordine in altro modo. Notare: Tutti gli algoritmi di ordinamento considerati fino ad ora sono algoritmi di ordinamento per confronto. Copyright © 2004 - The McGraw - Hill Companies, srl
Lower bound W(n log n) per l’ordinamento Consideriamo un generico algoritmo A, che ordini eseguendo solo confronti: dimostreremo che A esegue (nel caso peggiore) W(n log n) confronti Un generico algoritmo di ordinamento per confronti lavora nel modo seguente: Confronta due elementi ai ed aj (ad esempio effettua il test ai aj); A seconda del risultato, riordina e/o decide il confronto successivo da eseguire. Un algoritmo di ordinamento per confronti può essere descritto in modo astratto usando un albero di decisione, nel quale i nodi interni rappresentano i confronti, mentre le foglie rappresentano gli output prodotti Copyright © 2004 - The McGraw - Hill Companies, srl
Albero di decisione Un albero di decisione è associato ad uno specifico algoritmo A e ad una specifica dimensione n dell’istanza Descrive le diverse sequenze di confronti che A esegue su un’istanza <a1,a2,…,an> di lunghezza n; i movimenti dei dati e tutti gli altri aspetti dell’algoritmo vengono ignorati Nodo interno (non foglia): i:j (modella il confronto tra ai e aj) Nodo foglia: i1,i2,…,in (modella una risposta (output) dell’algoritmo, ovvero una permutazione <ai1,ai2,…,ain> degli elementi)
Esempio È proprio l’Insertion Sort 2 su una sequenza di 3 elementi! Input <a1,a2,a3> scambia a1 e a2, quindi la sequenza diventa <a2,a1,a3> Riconoscete l’algoritmo associato? È proprio l’Insertion Sort 2 su una sequenza di 3 elementi! Approfondimento: costruire l’albero di decisione per il SS e per l’IS-1 su una sequenza di 3 elementi. Copyright © 2004 - The McGraw - Hill Companies, srl
Richiamo di definizioni radice Sotto-albero sinistro Sotto-albero destro Profondità di un nodo: lunghezza del cammino (in termini di numero di archi) che lo congiunge alla radice. Altezza di un albero: valore massimo della profondità dei nodi. Copyright © 2004 - The McGraw - Hill Companies, srl
Proprietà Per una particolare istanza, i confronti eseguiti da A su quella istanza rappresentano un cammino radice – foglia L’algoritmo segue un cammino diverso a seconda delle caratteristiche dell’input Caso peggiore: cammino più lungo Caso migliore: cammino più breve Il numero di confronti nel caso peggiore è pari all’altezza dell’albero di decisione (ovvero alla lunghezza, in termini di numero di archi, del più lungo cammino radice-foglia) Copyright © 2004 - The McGraw - Hill Companies, srl
h(k) ≥1+h(k/2) ≥ (hp induttiva) 1+log (k/2) Altezza in funzione delle foglie Lemma: Un albero binario (ovvero, in cui ogni nodo interno ha al più due figli) con k foglie ha altezza h(k) log k. Dim: Dimostrazione per induzione sul numero di foglie k: Caso base k=1: banale, perché ogni albero con una foglia deve avere almeno altezza log21=0 (anche nel caso limite dell’albero costituito da un unico nodo ) Caso k>1: supposto vero per k-1 foglie, dimostriamolo per k; poiché la radice ha almeno un figlio, uno dei suoi al più due sottoalberi deve contenere almeno la metà delle foglie, e quindi h(k) ≥1+h(k/2) ≥ (hp induttiva) 1+log (k/2) =1+log k-log 2=log k. QED Copyright © 2004 - The McGraw - Hill Companies, srl
Il lower bound W(n log n) Consideriamo l’albero binario di decisione di un qualsiasi algoritmo che risolve il problema dell’ordinamento di n elementi Tale albero deve avere almeno n! foglie: infatti, se l’algoritmo è corretto, deve contemplare tutti i possibili output, ovvero le n! permutazioni della sequenza di n elementi in input Dal lemma precedente, avremo che l’altezza h(n) dell’albero di decisione sarà: h(n) log (#foglie) log (n!) = log (n·(n-1)·(n-2)·…·2·1) = log n+log (n-1) +…+ log (n/2)+…+log 2 + log 1 log n+log (n-1) +…+ log (n/2) (i termini successivi vengono trascurati) log (n/2)+log (n/2)+…+log (n/2) = n/2 log (n/2), ovvero h(n) = W(n log n). QED Copyright © 2004 - The McGraw - Hill Companies, srl