Teoria della Complessità! Limitazioni superiori

Download Report

Transcript Teoria della Complessità! Limitazioni superiori

Teoria della Complessità!
! 
La Teoria della Complessità Computazionale si
occupa della classificazione dei problemi
computazionali in accordo alla loro intrinseca
difficoltà.!
! 
! 
analizza la trattabilità dei problemi allorché si
pongono opportuni limiti alle risorse che possono
essere utilizzate.!
per trattabilità si intende il fatto che i problemi
ammettano una soluzione algoritmica efficiente.!
Limitazioni superiori!
"Il costo computazionale di un algoritmo che
risolve un dato problema, !
! 
! 
espresso in funzione della dimensione del problema
stesso !
e riferito a una ben precisa risorsa (tipicamente
spazio e/o tempo), !
"costituisce una limitazione superiore alla
complessità del problema.!
Limitazioni superiori!
Limite superiore: !
! 
! 
l algoritmo testimonia il fatto che un
certo numero di operazioni sono sufficienti a
risolvere il problema, !
ma non esclude la possibilità che esistano
algoritmi più efficienti, ossia algoritmi che
impiegano meno operazioni. !
Limitazioni inferiori!
Limite inferiore per un problema!
!misura delle risorse di calcolo
necessarie per risolvere il problema"
Complessità computazionale
di un problema!
"La complessità computazionale di un
problema (rispetto ad una certa
misura del costo) è determinata
quando la limitazione inferiore coincide
con la limitazione superiore. !
Complessità computazionale!
!Mancanza di tecniche utilizzabili per
dimostrare limitazioni inferiori di complessità
non banali: "!
"La limitazione inferiore si deve applicare ad ogni
algoritmo per un problema.!
!Come caratterizzare tutti gli algoritmi per un certo
problema? "
!Come escludere l'esistenza di un algoritmo ingegnoso
fino ad oggi sconosciuto? "!
Algoritmi di costo polinomiale
e problemi intrattabili!
"La bontà di un algoritmo è valutata rispetto al
suo comportamento asintotico, ovvero quando la
dimensione del problema tende all'infinito:!
! 
! 
Un buon comportamento asintotico garantisce che
ad una crescita della dimensione corrisponda una
crescita ragionevole del costo dell'algoritmo. !
Viceversa, un cattivo comportamento asintotico
rende l'algoritmo applicabile solo a istanze di
dimensione limitata.!
Algoritmi di costo polinomiale!
! 
Un algoritmo si classifica come efficiente o
inefficiente a seconda che il suo tempo di esecuzione
sia polinomiale o esponenziale nella dimensione del
problema. !
! 
Un algoritmo ha costo in tempo polinomiale se il suo
tempo di esecuzione su qualsiasi input è limitato da
una funzione polinomiale nella dimensione del
problema, ovvero nella lunghezza dei dati di input!
Algoritmi di costo polinomiale!
! 
! 
Ogni algoritmo il cui tempo di esecuzione non
possa essere limitato in questo modo è detto
di costo in tempo esponenziale.!
La definizione include anche algoritmi il cui
tempo di calcolo cresce, in funzione della
dimensione n del problema, come n log n, che
non sono andamenti esponenziali
(superpolinomiali).!
Trattabilità e intrattabilità!
! 
! 
! 
Un problema è intrattabile se si può dimostrare che
non esistono algoritmi di costo in tempo polinomiale per
risolverlo. !
Un problema è presumibilmente intrattabile se non si
conoscono algoritmi di costo polinomiale che lo
risolvono, ma non ne è stata dimostrata formalmente
l'intrattabilità. !
Un problema è trattabile se esiste un algoritmo per la
sua risoluzione di costo in tempo polinomiale.!
Trattabilità e intrattabilità!
Problemi trattabili"!
"ammettono algoritmi di soluzione
praticamente eseguibili.!
Problemi (presumibilmente) intrattabili: !
"gli algoritmi di soluzione possibili (noti)
sono così inefficienti da impedirne una
pratica esecuzione su qualsiasi
calcolatore.!
Algoritmi di Euclide per il
calcolo del MCD di due interi!
a, b ! ", !
a # b, a > 0, b # 0!
MCD(a,b)!
"if (b==0) return a;!
"else return MCD(b, a mod b); !
Simulazione!
MCD(306, 135)!
!
a!
306!
135!
36!
27!
9!
b!
a mod b!
135!
36!
27!
9!
0!
36!
27!
9!
0!
risultato!
9!
Complessità!
! 
Si esprime in funzione della dimensione
dei dati, ovvero nella lunghezza della
loro rappresentazione."
! 
Istanza di input I = a, b!
! 
n = | I | = #(log a + log b) = #(log a)!
! 
T(n) è proporzionale al numero di
chiamate ricorsive.!
Complessità!
! 
In ogni chiamata risulta: a mod b < a/2!
! 
a si riduce almeno della metà ogni due chiamate !
! 
! 
Con O(log a) chiamate si raggiunge la condizione di
chiusura.!
In ogni chiamata si esegue il calcolo di un modulo
(algoritmo di divisione). Il costo è !
#(log a $ log b) = O(log2 a)!
%  L
algoritmo è CUBICO in n (dimensione dell input):!
"T(n) = O(log a) $ O(log2 a) = O(n3)!
Algoritmi polinomiali e
esponenziali!
! 
! 
! 
Consideriamo un problema & e tre algoritmi di
risoluzione: !
! 
A1 di costo in tempo n"
! 
A2 di costo in tempo n2"
! 
A3 di costo in tempo 2 n!
Supponiamo di avere a disposizione un calcolatore che
esegue 109 op/sec!
Per n = 80!
! 
A1 termina in 80 10-9 s = 8 10-8 s"
! 
A2 termina in 802 10-9 s = 6,4 10-6 s"
! 
A3 richiede circa 1015 s, pari a circa 30 milioni di anni!"
Progresso tecnologico e
algoritmi!
! 
! 
Supponiamo di avere a disposizione:!
! 
un certo tempo di calcolo: t!
! 
un calcolatore C1!
! 
un calcolatore C2, k volte più veloce di C1!
Usare C2 per un tempo t equivale a usare C1
per un tempo kt!
! 
n1 : dati trattabili in tempo t su C1!
! 
n2 : dati trattabili in tempo t su C2!
Algoritmo polinomiale!
! 
risolve il problema in tempo: t = c n s!
"
"
"
"c n1s = t!
" "c n2s = kt!
%  n2s = kt/c = k n1s!
%  n2 = k 1/s n1 !
% 
incremento moltiplicativo!
Progresso tecnologico e
algoritmi polinomiali!
!Il progresso tecnologico si riflette in un
fattore moltiplicativo, il cui esatto
valore dipende dal grado del polinomio: !
"minore il grado, maggiore l'incremento di
dimensione che possiamo sostenere."
"Per s =2, k = 1000, possiamo moltiplicare per
' 30 il numero di dati trattabili a pari tempo
di calcolo.!
Progresso tecnologico ed
algoritmi polinomiali!
"Il fattore moltiplicativo è comune di ogni
algoritmo di costo polinomiale."
"Nel caso migliore (algoritmi di costo lineare),
l incremento di dimensione è proporzionale al
fattore di progresso tecnologico. "
Algoritmo esponenziale!
risolve il problema in tempo: t = c 2 n!
" "c 2 n1 = t!
" "
"c 2 n2 = kt!
! 
%  2 n = k 2 n !
%  n2 = n1 + log2 k!
2
%  !
1
"incremento
additivo, e ridotto dalla
funzione logaritmo.!
Progresso tecnologico ed
algoritmi esponenziali!
! 
"
Se k = 106, possiamo sommare solo !
"
"
"log 106 ' 20 !
"al numero di dati trattabili a pari tempo
di calcolo.!
! 
Questo perché l'algoritmo ha costo 2 n:
ben poco può la tecnologia di fronte ad
algoritmi esponenziali!!
Esempio: test di primalità!
Problema: Stabilire se N è primo.!
"N sui rappresenta con n = #(log N) cifre
binarie. Quindi |I| = n.!
"Osservazione: !
"se N non è primo, allora N possiede almeno un
divisore $ N1/2!
Esempio: test di primalità!
Primo(N)!
for (i = 2; i $ N1/2; i++)!
" if (N % i == 0) return false;!
return true;!
Complessità al caso pessimo!
! 
! 
Il ciclo for viene eseguito N1/2 volte, e il suo
costo è #(log2 N)!
Dato che n = #(log N), il costo in tempo al caso
pessimo risulta!
T(|I|) = T(n) = N1/2 #(log2 N) = #((2n)1/2 n2)!
!  Algoritmo pseudopolinomiale:!
"polinomiale nel valore N!
"esponenziale nella rappresentazione di N!
Complessità al caso pessimo!
! 
L algoritmo non sfrutta alcuna
proprietà del problema, ma procede
per enumerazione completa dei casi:!
tutti i possibili divisori $ N1/2!
!  esprimibili come tutte le configurazioni
binarie di n/2 bit: 2n/2.!
! 
! 
Da questa enumerazione discende
l esponenzialità.!
Problemi decisionali!
! 
! 
L'oggetto principale di studio in teoria della
complessità sono i problemi decisionali, ossia i
problemi la cui soluzione equivale ad una scelta
tra due valori alternativi: SI e NO.!
Anziché determinare una soluzione del problema
&, si chiede di stabilire se esiste una soluzione
che goda di certe proprietà.!
&(x) = SI ( x è una istanza accettabile.!
27!
La classe P!
"La classe P è la classe dei problemi
decisionali che possono essere
risolti da un algoritmo polinomiale."
28!