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: Introduzione e analisi di algoritmi, Dispense di Informatica

dispense che spiegano la complessità computazionale: introduzione; calcolo; efficienza degli algoritmi ecc..

Tipologia: Dispense

2016/2017
In offerta
30 Punti
Discount

Offerta a tempo limitato


Caricato il 24/04/2017

alessandro-gori
alessandro-gori 🇮🇹

5

(2)

10 documenti

1 / 51

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Complessità computazionale 1
Complessità computazionale
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
Discount

In offerta

Anteprima parziale del testo

Scarica Complessità computazionale: Introduzione e analisi di algoritmi e più Dispense in PDF di Informatica solo su Docsity!

Complessità computazionale

Introduzione alla complessità computazionale

Un problema spesso può essere risolto utilizzando algoritmi diversi

 Come scegliere il “migliore”?

La bontà o efficienza di un algoritmo si misura in base alla quantità minima di risorse sufficienti per il calcolo:  Il tempo richiesto per eseguire le azioni elementari  Lo spazio necessario per memorizzare e manipolare i dati

La risorsa di maggior interesse è il tempo

Misurare il tempo di calcolo

La complessità dei problemi da risolvere dipende dalla dimensione dei dati in ingresso

Il tempo di calcolo si può quindi esprimere come:

Le operazioni elementari sono quelle:

 aritmetiche  logiche  di confronto  di assegnamento

Solitamente, il numero di operazioni considerate è valutato nel caso peggiore , ossia nel caso di dati in ingresso più sfavorevoli tra tutti quelli di dimensione n

il numero complessivo di operazioni elementari in funzione della dimensione n dei dati in ingresso

Calcolo dell’efficienza: un esempio

Trovare l’elemento minimo in un insieme di n numeri {x 1 ,x 2 ,…,xn}

Soluzione:

  1. considero x 1 come candidato ad essere il minimo
  2. confronto il candidato con tutti gli altri elementi e se trovo un elemento più piccolo lo faccio diventare il nuovo candidato
  3. al termine dei confronti, il candidato corrente è sicuramente il minimo

Complessivamente sono stati eseguiti n confronti

L’efficienza dell’algoritmo è quindi direttamente proporzionale alla dimensione dell’input

Efficienza degli algoritmi

L’efficienza di un algoritmo si può esprimere mediante una funzione f(n) della variabile n:

 esprime il numero di operazioni compiute per un problema di dimensione n  rappresenta la complessità computazionale dell’algoritmo

Se A e B sono due algoritmi che risolvono lo stesso problema e se fA(n) e fB(n) esprimono la complessità dei due algoritmi allora:

A è migliore di B se, al crescere di n, risulta fA(n)fB(n)

Efficienza degli algoritmi: esempio

Supponiamo di avere due algoritmi diversi per ordinare n numeri interi  Il primo algoritmo riesce ad ordinare gli n numeri con n^2 istruzioni  Il secondo con n * log n istruzioni

Supponiamo che l’esecuzione di un’istruzione avvenga in un sec (10-6^ sec)

Tempo di esecuzione:

n^2 op.

n*log n op.

n=10 n=10000 n=10^6

0,1 msec 100 sec (1,5 min) 106 sec (12 gg.)

23 sec 92 msec 13,8 sec

Dipendenza dalla tecnologia

Il miglioramento della tecnologia non riduce significativamente il tempo di esecuzione di alcune importanti classi di algoritmi:

 Algoritmi di Ricerca ( n operazioni)  Algoritmi di Ordinamento ( n^2 operazioni)  Algoritmi Decisionali ( 2 n^ operazioni)

  • Esempio:

Complessità Tecnologia attuale^ 100 volte più veloce^ 1000 volte più veloce

n

n^2

2 n

N 1

N 2

N 3

N 1 * 100 N 1 * 1000

N 2 * 10 N 2 * 31,

N 3 + 6,64 N 3 + 9, N = numero dati gestiti in un lasso di tempo t (dipendente dalla complessità) Ad es.: 2N^ operazioni (op.) nel tempo t. Con tecnologia 100 volte più veloce 2N^ op. in t/100, quindi 2N^ *100 op. nel tempo t, 2N^ *26,64^ = 2N+6,64^ op. nel tempo t.

Il modello di costo

Per giungere a un modello di costo è necessario definire:

 Dimensione dell’input  Istruzione di costo unitario (passo base)  Calcolo della complessità in numero di passi base  Complessità  Nel caso migliore  Nel caso medio  Nel caso peggiore  Complessità di programmi strutturati  Complessità asintotica

Operazione di costo unitario

  • È un’operazione la cui esecuzione non dipende dai valori e dai tipi delle variabili - Assegnamento e operazioni aritmetiche di base - Accesso ad un elemento qualsiasi di un vettore residente in memoria centrale - Valutazione di un’espressione booleana qualunque - Istruzioni di input/output
  • In seguito, si indicherà un’operazione di costo unitario con il termine passo base

Modello semplificato

  • Il costo del test di una condizione booleana composta di più condizioni booleane semplici è sempre minore o uguale a K volte il costo del test di una condizione semplice, dove K è una opportuna costante numerica, quindi, semplificando, consideriamo comunque un costo unitario
  • Lo stesso vale per le operazioni aritmetiche composte
  • Non si considerano, in questa sede, operazioni di accesso ai file
  • Un modello più sofisticato dovrebbe inoltre:
    • differenziare tra aritmetica intera e reale (floating point)
    • tenere conto di come il compilatore traduce le istruzioni di alto livello (compilatori ottimizzanti)
    • considerare l’architettura di una specifica macchina

Calcolo della complessità in numero di passi base (2)

  • Il corpo del ciclo si compone di 2 passi base:
    • Assegnamento esterno: 1
    • Numero di test: n+
    • Assegnamenti interni: 2*n
    • Numero totale di passi base: 3*n+

i = 0; while(i < n){ i = i+1; j = j*3 + 42; }

Calcolo della complessità in numero di passi base (3)

  • Il test viene eseguito 2n+1 volte e il corpo è costituito da due passi base: - Assegnamento esterno: 1 - Numero di test: 2n+ - Assegnamenti interni: 2(2n) - Numero totale di passi base: 6*n+

i = 0; while(i < 2n){ i = i+1; j = j3 + 4367; }

Il costo può dipendere dal valore dei dati in ingresso!

  • Attenzione: esprimere la complessità in funzione dei dati in ingresso! - Quanti test vengono eseguiti? - Quante volte viene eseguito il ciclo?

i = 0; while(i*i < n) i = i+1;

Il costo può dipendere dal valore dei dati in ingresso!

  • Supponiamo n=9:
    • i=
    • i^2 =0 <9? sì i=
    • i^2 =1 <9? sì i=
    • i^2 =4 <9? sì i=
    • i^2 =9 <9? no fine ciclo
    • Il ciclo viene eseguito 3 = 9 volte, eseguendo 4 = 9+ test
    • La complessità in passi base di questo blocco è dunque:

(con arrotondamento all’intero superiore)

i = 0; while(i*i < n) i = i+1;

1 + (n+1) + n = 2 + 2* n