Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Complessità Computazionale: Esercitazioni, Appunti di Informatica

Complessità computazionale per liceo scientifico o informatico

Tipologia: Appunti

2019/2020

Caricato il 23/11/2020

Matvin24
Matvin24 🇮🇹

4 documenti

1 / 26

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
COMPLESSITA’
COMPUTAZIONALE
Esercitazioni
Tutor: Francesca Piersigilli
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a

Anteprima parziale del testo

Scarica Complessità Computazionale: Esercitazioni e più Appunti in PDF di Informatica solo su Docsity!

COMPLESSITA’

COMPUTAZIONALE

Esercitazioni

Tutor: Francesca Piersigilli

La

complessità computazionale

si occupa della

valutazione del

costo

degli algoritmi in termini di

risorse di calcolo:•

tempo

di elaborazione;

•quantità di memoria (

spazio

) utilizzata.

L'obiettivo è quello di comprendere le prestazionemassime raggiungibili da un algoritmo applicato adun determinato problema.

COMPLESSITA’ TEMPORALE

La complessità temporale può essere vista come somma di duecomponenti:•tempo di compilazione•tempo di esecuzioneL’unica quantità che interessa realmente è il tempo di esecuzione: ¾

richiede una profonda conoscenza del compilatore; ¾

è strettamente dipendente dalle ottimizzazioni effettuate; ¾

viene influenzato dall’architettura su cui il programma viene eseguito.

PASSO DI UN PROGRAMMA

Una stima della complessità temporale di un algoritmopuò essere effettuata contando il numero di operazionisvolte.Si definisce

PASSO DI UN PROGRAMMA

Program

Step

) un segmento di codice autonomo e coerente dal

punto di vista semantico o sintattico.La valutazione delle prestazioni mediante il conteggiodei passi di programma eseguiti, è indipendente sia dalcalcolatore utilizzato che dal compilatore.

Dato un algoritmo A la complessità viene determinata contando il numero di operazioni

aritmetiche e logiche,

accesso ai file, letture e scritture in memoria...Occorre tener presente che il tempo

t

dipende dai seguenti

fattori:•la

macchina usata

, intendendo con ciò l'hardware, il

sistema operativo, il compilatore e, in macchinemultitasking, il carico;•la

configurazione dei dati in ingresso

•la

dimensione dei dati in ingresso.

COMPLESSITA

Ipotesi semplificativa

Il tempo impiegato è proporzionale al numero di operazionieseguite (ciascuna a costo unitario), non ci si riferisce, quindi, aduna specifica macchina, ma ci si basa su un modello astratto dicalcolatore.Occorre svincolarsi da una particolare configurazione dei dati iningresso, ad esempio basandosi sulla configurazione cherappresenta il caso peggiore, ovvero quello che comporta ilmaggior costo computazionale.Il tempo impiegato per risolvere un problema dipende siadall'algoritmo utilizzato che dalla

"dimensione" dei dati

a cui si

applica l'algoritmo. Quindi nell'ipotesi semplificativa, il tempodeve essere una funzione della dimensione dell'input.

ESEMPIO

Moltiplicazione di due matrici quadrate nxn di interi:per calcolare C[i,j] si eseguono 2n letture, n moltiplicazioni, n-1 addizionied 1 scritturan = 3 C = A x B

A
B

c[1,1] = a[1,1]b[1,1]+ a[1,2]b[2,1]+ a[1,3]*b[3,1]Per calcolare un generico c[i,j] si eseguono, quindi 4n

2n

3 +n

3 +n

2 (n-1)+n

2

Comportamento asintotico: notazione O

Individuare con esattezza la funzione

time(n)

è spesso

molto difficile.Spesso però, è sufficiente stabilire il comportamentoasintotico della funzione quando le dimensionidell'ingresso tendono ad infinito (

comportamento

asintotico dell'algoritmo

Esempi: time(n)= 3n

2 +4n+3 = O(n

2 ), perché 3n

2

+4n+3 <= 4n

2

per n>3time(n)=4n

3

= O(n

Attraverso la notazione O( ), gli algoritmivengono divisi in

classi

, ponendo nella

medesima classe quelli la cui

complessità è dello

stesso ordine di grandezza

Classi di complessità (I)

1) Complessità

costante

O(1) È posseduta dagli algoritmi che eseguono sempre lo stessonumero di operazioni indipendentemente dalla dimensionedei dati.Es: inserimento o estrazione di un elemento dalla testa diuna lista concatenata, ecc.

2) Complessità

sottolineare

O(kn), k<1 Es: Ricerca binaria, o logaritmica, ecc.

Classi di complessità (III)

5) Complessità

n

k

O(n

k)

, con k>=

Es: Bubblesort (O(n

2 )), moltiplicazione di due 2 matrici (O(n

3 )), ecc.

Tutte le classi di complessità elencate precedentemente vengonogenericamente considerate come polinomiali. Esse sonocaratterizzate dal fatto che la dimensione

n

non compare mai come

esponente in alcun modo. Quando ciò avviene si parla invece dicomplessità esponenziale….

6) Complessità

esponenziale

O(k

n)

cioè esponenziale.

Es: Torre di Hanoi O(

n^ )

¾

Possono richiedere tempi di esecuzione grandissimi anche per

n

piccoli ed

indipendentemente dalla velocità dell'elaboratore. ¾

Esistono molti problemi per i quali non si conoscono ancora algoritmi non esponenziali (problemi intrattabili), come il problema del commesso viaggiatore. ¾

Un problema è computazionalmente

trattabile

se esiste un algoritmo

efficiente

che lo risolve; altrimenti il problema è computazionalmente

intrattabile

.

¾

Un algoritmo si dice

efficiente

se il suo tempo di esecuzione è limitato

superiormente da una funzione polinomiale (funzione limitata superiormente da n

k

per un opportuno fissato intero k).

ESEMPIO Dato un problema P e due algoritmi A1 e A2 che lo risolvonosiamo interessati a determinare quale ha complessità minore (qual è"il migliore" dal punto di vista dell'efficienza computazionale).timeA1(n) = 3n

2

  • n

timeA2(n) = n

2

  • 10n

Per n>=5, timeA2(n) < timeA1(n). La complessità di A2 è minoreper ingressi con dimensione maggiore di 5.NB: non è detto che quel che vale per n "grande" valga anche per n"piccolo". Ma ci interessa che un algoritmo sia efficiente per ngrande (se n "piccolo", c'è poca differenza, e comunque ognialgoritmo va bene... o quasi!)

Definizione Un algoritmo (programma) ha costo

(g(n))

(o complessità

(g(n)) ) se esiste una opportuna costante positiva

c

tale che:

_timeA(n) > cg(n)_* per un numero infinito di valori di n. Esempio 3n

2 +n =

Ω

(n

2 ) (ma anche

Ω

(n) e

Ω

(n*log n))

Ω

(g(n)), rappresenta un limite inferiore al comportamento di una funzione. Si ha una valutazione esatta del costo di un algoritmo quando ledue delimitazioni O(f(n)) e

(f(n)) coincidono.

Comportamento asintotico: notazione