Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 )...

26
esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) 1 log log ... 2 ... 2 3 n n n n n n n Valutare la difficoltà dei problemi

Transcript of Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 )...

Page 1: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

esiste un algoritmo che risolve il problema con questa complessità

limite superiore: O(n2)

1

log

log

...

2

...

2

3

nn

nn

n

n

n

Valutare la difficoltà dei problemi

Page 2: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Valutare la difficoltà dei problemi

ogni algoritmo che risolve il problema ha complessità maggiore o uguale di questalimite inferiore: (n)

1

log

log

...

2

...

2

3

nn

nn

n

n

n

Page 3: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Un limite superiore per il problema dell’ordinamento

Abbiamo visto che Insert-Sort per ordinare n oggetti richiede O(n2) operazioni

Quindi O(n2) è un limite superiore

Page 4: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Vedremo in seguito che (n log n) è un limite stretto per il problema dell’ordinamento.

Per ora ci limitiamo a dimostrare che:

La complessità nel caso pessimo di ogni algoritmo di ordinamento sul posto che confronta e scambia tra loro soltanto elementi consecutivi dell’array è (n2).

Quindi il problema di ordinare sul posto un array scambiando tra loro soltanto elementi consecutivi ha complessità (n2).

Page 5: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Se l’array è ordinato non ci sono inversioni.

Se l’array è ordinato in senso opposto e gli elementi sono tutti distinti allora ogni coppia (i, j) di indici con i < j è una inversione e quindi ci sono esattamente n(n-1)/2 inversioni.

Sia A[1..n] un array

Se i < j e A[i] > A[j] diciamo che la coppia di indici (i, j) è una inversione

8 3i j

3k

Page 6: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Come cambia il numero di inversioni quando facciamo uno scambio tra due elementi consecutivi A[i] ed A[i+1] dell’array?

Consideriamo tutte le coppie di indici ( j, k) con j < k e vediamo quante e quali di esse possono cambiare di stato da inversioni a non inversioni o viceversa quando scambiamo A[i] con A[i+1].

xi i+1

y

Page 7: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Se j e k sono entrambi diversi da i e i+1 la coppia ( j, k) non cambia di stato e quindi il numero di inversioni di questo tipo non cambia.

y xi i+1

u vkj

Page 8: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

(i, k) è inversione dopo lo scambio se e solo se (i+1, k) lo era prima e (i+1, k) è inversione se e solo se (i, k) lo era prima.

y xi i+1

vk

x yi i+1

vk

Quindi le due coppie si scambiano gli stati ma il numero totale di inversioni non cambia.

Consideriamo le due coppie (i, k) e (i+1, k) con k > i+1 ossia

Page 9: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

y xi i+1

uj

x yi i+1

uj

La situazione è simmetrica di quella precedente e quindi anche in questo caso il numero totale di inversioni non cambia.

Consideriamo le coppie (j, i) e (j,i+1) con j < i ossia

Page 10: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

In conclusione con lo scambio di due elementi consecutivi dell’array il numero totale di inversioni aumenta o diminuisce di 1 (o rimane invariato se i due elementi scambiati erano uguali).

Rimane soltanto da considerare la coppia (i, i+1) che con lo scambio cambia di stato se i due elementi sono diversi.

Page 11: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Nel caso pessimo in cui l’array è ordinato in senso inverso e gli elementi sono tutti distinti le inversioni iniziali sono n(n-1)/2.

Siccome n(n-1)/2 = (n2) rimane dimostrato il limite inferiore.

Occorrono quindi almeno n(n-1)/2 scambi tra elementi consecutivi per ridurre tale numero a 0.

Page 12: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esercizio: Abbiamo dimostrato che scambiando due elementi diversi consecutivi il numero totale di inversioni aumenta o diminuisce di 1.

Quindi se prima dello scambio il numero di inversioni totale era pari, dopo lo scambio esso risulta dispari e viceversa.

Mostrare che questo cambiamento della parità del numero totale di inversioni avviene anche se si scambiano due elementi diversi non consecutivi.

Page 13: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Soluzione delle ricorrenzeMetodo di sostituzione: Si assume che la soluzione sia di un certo tipo, ad esempio

3221 log)( knknnknT dove k1, k2 e k3 sono delle costanti

Si sostituisce la soluzione nella ricorrenza e si cercano dei valori delle costanti per i quali la ricorrenza è soddisfatta. Se le cose non funzionano si riprova con un altro tipo di soluzione.

Page 14: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esempio:

1 se)2/(2

1 se)(

nnTabn

ncnT

assumiamo 3221 log)( knknnknT

sostituendo si ottiene:

1 se)22

log2

(2

1 se

log

3221

3221

nkn

knn

kabn

nc

knknnk

Le costanti k1, k2 e k3 devono essere le stesse a sinistra e a destra.

Page 15: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

per n = 1 si ottiene:

da cui e , 231 ackakbk

e dunque è la soluzione.

anacnbnnT )(log)( 2

ckk 32

mentre per n > 1

32121

3221

2)(log

log

kankkbnnk

knknnk

Page 16: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Soluzione delle ricorrenze

Metodo dell’esperto: Fornisce direttamente le soluzioni asintotiche di molte ricorrenze del tipo:

)()/()( nfbnaTnT

dove n/b significa anche n/b o n/b

Page 17: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Teorema dell’esperto: Se T(n) = aT(n/b)+f(n) è una ricorrenza con a ≥ 1 e b > 1 costanti e dove n/b può essere anche n/b o n/b allora :

per qualche costante > 0 )( se )()( 1. loglog aa bb nOf(n)nnT

)( se )log()( 2. loglog aa bb nf(n)nnnT

)( se ))(()( 3. log abnf(n)nfnTper qualche costante ε > 0 ed esistono k < 1 ed N tali che a f(n/b) k f(n) per ogni n N

Page 18: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

1 se)()/(

1 se)(

nnfbnaT

ncnT

)/( bnf )/( bnf

)(nf

a

nblog

)(nf

)/( bnaf

nbca log

)/( 22 bnfa

abcnlog

)/( 2bnf )/( 2bnf )/( 2bnf )/( 2bnf

an

n b

b

b cnb

nfa

b

nfa

b

nafnfnT log

1log1log

22 )(...)()()()(

c c c c cc c c cc c c cc c c cc c c c

Intuizione:

Page 19: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Come usare il Teorema dell’esperto T(n) = aT(n/b)+f(n)

2. Calcolare ablog

4. Se il limite è finito e diverso da 0 siamo nel Caso 2 e

)log)(()log()( log nnfnnnT ab

3. Calcolare il limite an bn

f(n)loglim

1. Togliere eventuali arrotondamenti per eccesso o per difetto

Page 20: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

5. Se il limite è 0 potremmo essere nel Caso 1. Per esserne sicuri occorre trovare un valore positivo ε per il quale risulti finito il limite

nel qual caso possiamo concludere

Se per ogni ε positivo tale limite risulta infinito il teorema dell’esperto non si può usare.

an bn

f(n)loglim

)()( log abnnT

Page 21: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

6. Se il limite è ∞ potremmo essere nel Caso 3. Per esserne sicuri occorre trovare un ε positivo per il quale risulti diverso da 0 il limite

an bn

f(n)loglim

Se è 0 per ogni ε positivo non si può usare il teorema dell’esperto.

Altrimenti prima di concludere bisogna studiare la disequazione a f(n/b) ≤ k f(n)

Page 22: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Se tale disequazione è soddisfatta per qualche costante k strettamente minore di 1 e per tutti i valori di n da un certo valore N in poi possiamo concludere che

))(()( nfnT

Altrimenti il teorema dell’esperto non si può usare.

Page 23: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esempi:

siccome )()( log abnnf

e quindinnn ab 2loglog 2

possiamo applicare il Caso 2 e concludere

)log()log()( log nnnnnT ab

01minmin )2/(2)( cncnTnT QSQS

012/2/)( cncnTnTnT MSMSMS

)()()( nfb

naTnT

Trascurando gli arrotondamenti entrambe sono della forma:

Con a=b=2 ed f(n)=(n)

Page 24: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esempio: nn

TnT 2log)2

(2)(

)()( log abnOnfQuindi e si applica il Caso 1

)()()( log nnnT ab

e quindi

)()( log abnOnf

In questo caso 0log

lim)(

lim 2log n

n

n

nfnan b

)()( log abnOnfSe

Per nnn ab 5.02loglog 25.0

Caso 1?

e 0log

lim)(

lim 2log

n

n

n

nfnan b

Page 25: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esempio: 2)2

(2)( nn

TnT

)(5.02/)/( 2 nfnbnaf Inoltre

e quindi

)()( log abnnf

In questo caso n

n

n

nfnan b

2

log lim)(

lim

Caso 3? )()( log abnnfSe e )()/( nkfbnaf

5.0Per nnnn ab 5.02loglog 2

e nn

n

n

nfnan b

2

log lim)(

lim

)()( log abnnfQuindi

Si applica il Caso 3: )())(()( 2nnfnT

Page 26: Esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n 2 ) Valutare la difficoltà dei problemi.

Esempio: nnn

TnT 2log)2

(2)(

ma 1)(

)(lim

nf

nnfn

)(log)( log2

abnOnnnfe quindiper qualunque 0

e quindi non esiste nessun k < 1 tale che )()( nkfnnf per ogni n > N

nnn ab 2loglog 2 )(log)( log2

abnnnnf nnnn ab 1logma

Dunque non si può usare il metodo dell’esperto.

nnfnnnnn

b

naf )(log

2log

22)( 2

Neanche la seconda condizione è soddisfatta