Algoritmi e Strutture Dati

Documenti analoghi
Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e strutture dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Crescita funzioni. 20 novembre Come possiamo confrontare le funzioni di costo che abbiamo ottenuto finora?

Notazione asintotica. notazione Ω. notazione O. notazione o notazione ω. Marina Zanella Algoritmi e strutture dati Richiami matematici 1

Algoritmi e Strutture Dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Definizioni di base. Algoritmo: procedura computazionale ben definita che prende valori in input e produce valori in output.

Tecniche di analisi degli algoritmi

Appunti lezione Capitolo 2 Analisi delle funzioni di costo

Proprietà delle notazioni asintotiche

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Lezione 4 Ugo Vaccaro

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Algoritmi e Strutture Dati

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Algoritmi e Strutture di Dati

Proprietà delle notazioni asintotiche. Mercoledì 1 ottobre 2014

Informatica II. Capitolo 2 Analisi di algoritmi. Valutare la complessità in tempo. Complessità in tempo: cosa serve?

Esercizi per il corso di Algoritmi

3.2 Notazioni standard e funzioni comuni

Notazioni asintotiche. Martedì 30 settembre 2014

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet

Gli algoritmi e la loro complessità

Esercizi sulla complessità asintotica. Roberto Cordone

Laboratorio di Algoritmi e Strutture Dati

2.1 Computational Tractability. Chapter 2. Basics of Algorithm Analysis. Efficienza degli algoritmi. Efficienza degli algoritmi

Tecniche di analisi degli algoritmi

Tempo e spazio di calcolo

complessità degli algoritmi

Complessità degli algoritmi (cenni)

Testo di riferimento. Problema delle 12 monete. Algoritmi. Complessità degli algoritmi (cenni) Dispense del Corso di Algoritmi e Strutture Dati

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Laboratorio Algoritmi 2016

Nozioni di base (II Parte)

In questa lezione. Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort

Analisi degli algoritmi. Progettazione di Algoritmi a.a Matricole congrue a 1 Docente: Annalisa De Bonis

Algoritmi e Strutture Dati. Luciano Gualà

2.1 Notazione O (limite asintotico superiore)

In questa lezione: correttezza del mergesort Analisi del mergesort: relazioni di ricorrenza e alberi della ricorsione

Notazione asinto+ca II parte. IASD a.a A. De Bonis

Complessità computazionale

Fondamenti di Informatica II 9. Complessità computazionale

Appendice B. Algoritmi e Complessità

Fondamenti di Informatica

Richiami di Matematica. 1. Insiemi, relazioni, funzioni. 2. Cardinalitá degli insiemi infiniti e numerabilitá. 3. Notazione asintotica.

Notazione asinto0ca. Analisi degli algoritmi 3/22/15

Analisi degli algoritmi

poiché f(n) max{f(n),g(n)}, e g(n) max{f(n),g(n)}, sommando termine a termine: Quindi possiamo concludere che f(n)+g(n) = Θ(max{f(n),g(n)})

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

Algoritmi e Strutture Dati

Ordinamenti e crescita della complessità

Complessità computazionale concreta

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Ω (grande omega) Esempio 10 COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Dunque k vale all incirca log n: precisamente k = [log n] + 1.

Algoritmi e Strutture di Dati

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

Alberi binari: definizione e alcune proprietà

Algoritmi e Strutture Dati

Macchina RAM. Modelli di calcolo e metodologie di analisi. Linguaggio di una macchina RAM. Algoritmi e Strutture Dati. Istruzioni.

Algoritmi (e Complessità)

Ad ogni problema computazionale possiamo associare una misura della sua complessità.

3 CENNI DI TEORIA DELLA COMPLESSITA COMPUTAZIONALE. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

ELEMENTI DI LOGICA MATEMATICA LEZIONE VII

Elementi di Complessità Computazionale

Analisi di algoritmi e di problemi

Corso di Calcolo Numerico

Algoritmi e Laboratorio a.a Lezioni. prof. Elio Giovannetti. INTERMEZZO 1: una favola araba

Esercizi Capitolo 2 - Analisi di Algoritmi

METODI MATEMATICI PER L INFORMATICA

NOTE DI ALGEBRA LINEARE v = a 1 v a n v n, w = b 1 v b n v n

Informatica e Laboratorio di Programmazione complessità degli algoritmi Alberto Ferrari. Alberto Ferrari Informatica e Laboratorio di Programmazione

Metodi di Ottimizzazione

COMPLESSITA COMPUTAZIONALE. Esercitazioni Tutor: Francesca Piersigilli

Limiti e continuità. Hynek Kovarik. Analisi A. Università di Brescia. Hynek Kovarik (Università di Brescia) Limiti e continuità Analisi A 1 / 68

Successioni Numeriche

LA COMPLESSITA DEGLI ALGORITMI

Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi

Algoritmi e Strutture Dati

Tecniche Algoritmiche: divide et impera

non solo otteniamo il valore cercato per la validità della (1.4), ma anche che tale valore non dipende da

CORSO DI LAUREA IN FISICA

Elementi di Teoria degli Insiemi

1 ANALISI MATEMATICA A - Esercizi della settimana 3

Gli insiemi N, Z e Q. I numeri naturali

Corso di Analisi Numerica

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

ALGEBRA I: ASSIOMI DI PEANO E PROPRIETÀ DEI NUMERI NATURALI

Corso di Analisi Numerica

Trasformazioni Logaritmiche

Su alcuni numeri irrazionali

Transcript:

Analisi Asintotica Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino

Un graduale processo di astrazione Passo 1: abbiamo ignorato il costo effettivo delle singole istruzioni introducendo delle costanti per rappresentare i loro (ad esempio le costanti c 1,..., c 7 nel caso dell insertion sort) Passo 2: ci siamo resi conto che anche queste costanti forniscono dettagli non necessari il tempo di esecuzione dell insertion sort nel caso peggiore è an 2 + bn + c, dove a, b e c sono altre costanti che dipendono dai costi c i Passo 3: un ulteriore passo di astrazione consiste nel considerare l ordine di grandezza o tasso di crescita del tempo di esecuzione

Un graduale processo di astrazione Costo in microsecondi Costanti c i Costanti a, b e c an 2 +bn+c Ordine di grandezza: quadratico

Analisi Asintotica Supponiamo che il tempo necessario a completare un algoritmo sia T (n) = 4n 2 2n + 2 Per grandi valori di n, il termine 4n 2 è preponderante rispetto agli altri, che potranno non essere considerati per esempio, per n pari a 500, il termine 4n 2 = 1.000.000 è pari a 1000 volte il termine 2n = 1000 Anche i coefficienti diventano irrilevanti se compariamo T (n) con una funzione di ordine superiore, come n 3 oppure 2 n Anche se T (n) = 1.000.000n 2, U(n) = n 3 sarà maggiore di T (n) per ogni n maggiore di 1.000.000 (T (1.000.000) = 1.000.000 3 = U(1.000.000))

Analisi Asintotica Astraiamo da alcuni dettagli irrilevanti (ex: termini di ordine diverso, costanti moltiplicative) e ci interessiamo solo al tasso di crescita; analizziamo come il tempo di esecuzione cresce asintoticamente in funzione della dimensione dell input Obiettivo semplificare l analisi del tempo di esecuzione di un algoritmo (proprio perchè presciamo da dettagli non rilevanti) classificare le funzioni in base al loro comportamento asintotico Asintoticamente non significa per tutti gli input un algoritmo asintoticamente più efficiente di un altro sarà migliore pet tutti gli input tranne, eventualmente, per quelli molto piccoli

Analisi Asintotica Per determinare la il comportamento asintotico degli algoritmi importiamo alcune notazioni dalla matematica: O (o grande): ci consente di fornire delle delimitazioni superiori alla complessità di un algoritmo Ω (omega grande): fornisce delle delimitazione inferiori Θ (theta grande): fornisce delle delimitazioni strette, sia superiori che inferiori

la notazione o grande Analisi Asintotica O grande Omega grande Theta grande Definizione (la notazione O grande) Siano f, g : N R 0. Diciamo che f (n) = O(g(n)) se due costanti c, n 0 > 0 tali che 0 f (n) cg(n) per ogni n n 0 graficamente...

Graficamente Analisi Asintotica O grande Omega grande Theta grande

O grande Omega grande Theta grande Se f (n) = O(g(n)) allora g(n) è un limite asintotico superiore per f (n); f (n), a meno di un fattore costante, cresce al più come g(n) Ex: il limite superiore per la ricerca in un array non ordinato è O(n) O viene usata nell analisi del costo computazionale nel caso pessimo O(g(n)) è in realtà l insieme di funzioni definito come: O(g(n)) = {f (n) delle costanti c, n 0 > 0 tali che 0 f (n) cg(n) per ogni n n 0 } Scrivere f (n) = O(g(n)) è un abuso di notazione; avremmo dovuto scrivere f (n) O(g(n))

O grande Omega grande Theta grande Provare che f (n) = 3n 2 + 10n = O(n 2 ) Dobbiamo dimostrare l esistenza di costanti positive c ed n 0 tali che 0 f (n) cn 2 per ogni n n 0 Poichè : basta scegliere c = 13 e n 0 = 1 3n 2 + 10n per ogni n 1 3n 2 + 10n 2 = 13n 2

Vero o falso n 2 = O(n)? O grande Omega grande Theta grande Chiaramente è falsa: n non può essere un limite superiore per n 2. Lo dimostriamo per assurdo. Se n 2 = O(n), allora devono esistere delle costanti c, n 0 > 0 tali che ossia (dividendo tutto per n) 0 n 2 cn per ogni n n 0 0 n c per ogni n n 0 il che è impossibile visto che c è una costante

O grande Omega grande Theta grande Classi di complessità asintotica degli algoritmi T (n) = O(1): complessità costante (cioè T (n) non dipende dalla dimensione n dei dati di ingresso) T (n) = O(log n): complessità logaritmica. T (n) = O(n): complessità lineare. T (n) = O(n log n): complessità pseudolineare (così detta da n log n = O(n 1+ɛ ) per ogni ɛ > 0 T (n) = O(n 2 ): complessità quadratica T (n) = O(n 3 ): complessità cubica T (n) = O(n k ), k > 0: complessità polinomiale T (n) = O(α n ), α > 1: complessità esponenziale

la notazione Omega grande O grande Omega grande Theta grande Definition (la notazione Ω) Siano f, g : N R 0. Diciamo che f (n) = Ω(g(n)) se due costanti c, n 0 > 0 tali che 0 cg(n) f (n) per ogni n n 0 graficamente...

Graficamente Analisi Asintotica O grande Omega grande Theta grande

la notazione Ω grande O grande Omega grande Theta grande Se f (n) = Ω(g(n)) allora g(n) è un limite asintotico inferiore per f (n); f (n), a meno di un fattore costante, cresce almeno come g(n) Esempio: il limite inferiore per la ricerca in un array non ordinato è Ω(1) Ω viene usata nell analisi del costo computazionale nel caso ottimo Ω(g(n)) rappresenta l insieme di funzioni definito come: Ω(g(n)) = {f (n) delle costanti positive c ed n 0 tali che 0 cg(n) f (n) per ogni n n 0 } Di nuovo, scrivere f (n) = Ω(g(n)) è un abuso di notazione; avremmo dovuto scrivere f (n) Ω(g(n))

O grande Omega grande Theta grande Provare che f (n) = 3n 2 + 10n = Ω(n 2 ) Dobbiamo dimostrare l esistenza di costanti positive c ed n 0 tali che 0 cn 2 f (n) per ogni n n 0 Basta scegliere c = 3 e n 0 = 1; infatti: 3n 2 + 10n 3n 2 per ogni n n 0 = 1

Vero o falso n 2 = Ω(n 3 )? O grande Omega grande Theta grande Chiaramente è falsa: n 3 non può essere un limite inferiore per n 2. Lo dimostriamo per assurdo. Se n 2 = Ω(n 3 ), allora esistono delle costanti positive c ed n 0 tali che 0 cn 3 n 2 per ogni n n 0 ossia tali che (dividendo tutto per n 3 ) 0 c 1 n per ogni n n 0 il che è impossibile visto che c è una costante

la notazione Θ grande O grande Omega grande Theta grande Definizione (la notazione Θ (theta) grande) Siano f, g : N R 0. Diciamo che f (n) = Θ(g(n)) se delle costanti c 1, c 2, n 0 > 0 tali che 0 c 1 g(n) f (n) c 2 g(n) per ogni n n 0 graficamente...

la notazione Θ grande O grande Omega grande Theta grande

la notazione Θ grande O grande Omega grande Theta grande Se f (n) = Θ(g(n)) allora g(n) è un limite asintotico stretto per f (n); f (n), a meno di un fattore costante, cresce esattamente come g(n) Θ(g(n)) rappresenta l insieme di funzioni definito come: Θ(g(n)) = {f (n) costanti positive c 1, c 2 ed n 0 tali che 0 c 1 g(n) f (n) c 2 g(n) per ogni n n 0 } Scrivere f (n) = Θ(g(n)) è un abuso di notazione

O grande Omega grande Theta grande Provare che f (n) = 3n 2 + 10n = Θ(n 2 ) Theorem Per ogni coppia di funzioni f (n) e g(n), si ha che f (n) = Θ(g(n)) iff f (n) = O(g(n)) e f (n) = Ω(g(n))

O grande Omega grande Theta grande Provare che f (n) = 3n 2 + 10n = Θ(n 2 ) Theorem Per ogni coppia di funzioni f (n) e g(n), si ha che f (n) = Θ(g(n)) iff f (n) = O(g(n)) e f (n) = Ω(g(n)) Abbiamo dimostrato che f (n) = O(n 2 ) e f (n) = Ω(n 2 ). Questo basta per concludere che f (n) = Θ(n 2 )

Alcune utili proprietà Analisi Asintotica O grande Omega grande Theta grande Transitività f (n) = O(g(n)) e g(n) = O(h(n)) = f (n) = O(h(n)) f (n) = Ω(g(n)) e g(n) = Ω(h(n)) = f (n) = Ω(h(n)) f (n) = Θ(g(n)) e g(n) = Θ(h(n)) = f (n) = Θ(h(n)) Riflessività Simmetria f (n) = O(f (n)) f (n) = Ω(f (n)) f (n) = Θ(f (n)) f (n) = Θ(g(n)) iff g(n) = Θ(f (n)) Simmetria trasposta f (n) = O(g(n)) iff g(n) = Ω(f (n))

Le notazioni o piccolo ed ω piccolo Siano f, g : N R 0. Diciamo che f (n) = o(g(n)) se per ogni costante c > 0 esiste n 0 > 0 tale che 0 f (n) < cg(n) per ogni n n 0 Le definizioni di O ed o sono molto simili: nella prima, la condizione 0 f (n) cg(n) vale per un qualche c > 0 nella seconda, 0 f (n) < cg(n) vale per ogni c > 0 f (n) = o(g(n)) implica f (n) = O(g(n)) Il concetto intuitivo in questa notazione è che f (n) diventa trascurabile rispetto a g(n) quando n tende all infinito, cioè lim n f (n) g(n) = 0

Le notazioni o piccolo ed ω piccolo Siano f, g : N R 0. Diciamo che f (n) = ω(g(n)) se per ogni costante c > 0 esiste n 0 > 0 tale che 0 cg(n) < f (n) per ogni n n 0 Le definizioni di Ω ed ω sono molto simili: nella prima, la condizione 0 cg(n) f (n) vale per un qualche c > 0 nella seconda, 0 cg(n) < f (n) vale per ogni c > 0 f (n) = ω(g(n)) implica f (n) = Ω(g(n)) In questo caso, f (n) diventa aribitrariamente grande rispetto a g(n) quando n tende all infinito, cioè lim n f (n) g(n) =

Alcune utili proprietà Transitività f (n) = o(g(n)) e g(n) = o(h(n)) = f (n) = o(h(n)) f (n) = ω(g(n)) e g(n) = ω(h(n)) = f (n) = ω(h(n)) Simmetria trasposta f (n) = o(g(n)) iff g(n) = ω(f (n))

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O f (n) = O(g(n)) implica af (n) = O(g(n)) per ogni a > 0 Se f (n) = O(g(n)), allora c, n 0 > 0 tali che 0 f (n) cg(n) per ogni n n 0 Moltiplicando tutto per a otteniamo: 0 af (n) a (cg(n)) = (ac) g(n) = c g(n) per ogni n n 0 ossia af (n) = O(g(n))

log n = O(n) Analisi Asintotica Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Dimostriamo, per induzione su n, che log n n per ogni n 1 (questo corrispondere a scegliere c = 1 ed n 0 = 1 nella def di O). Caso base, n = 1: log 1 = 0 1 Passo induttivo: sia n 1 ed assumiamo log n n. Allora: log(n + 1) per ogni n 1 log(n + n) = log(2n) poichè log(ab) = log(a) + log(b) = log 2 + log n = 1 + log n per ipotesi induttiva 1 + n

log b n = O(n) per ogni b > 2 Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Possiamo applicare la regola per cambiamento di base dei logaritmi (log b n = log b a log a n) e otteniamo che log b n = log b 2 log n con log b 2 > log b 1 = 0 Poichè log n = O(n), abbiamo che (vedi dietro) log b n = O(n)

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O log b n k = O(n) per ogni b > 1 e k > 0 Usiamo un altra proprietà degli algoritmi: log a n k = k log a n. Allora: log b n k = k log b n con k > 0 Di nuovo, poichè log b n = O(n), possiamo concludere che (vedi dietro) log b n k = O(n)

Polinomi Analisi Asintotica Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Un polinomio in n di grado k è una funzione p(n) della forma p(n) = k a i n i = a 0 + a 1 n + a 2 n 2 +... + a k n k i=0 dove le costanti reali a 0, a 1,..., a k sono i coefficienti del polinomio e a k 0. Un polinomio è asintoticamente positivo se a k > 0. Se p(n) è un polinomio di grado k asintoticamente positivo, allora p(n) = Θ(n k )

n k = O(a n ) per ogni k 0 e a > 1 Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Per ogni k 0 e a > 1, Allora n k = o(a n ) E quindi anche n k = O(a n ) n k lim n a = 0 n

Che relazione c è tra 2 n e 3 n? Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Banalmente, poichè 2 n 3 n per ogni n 1, si ha 2 n = O(3 n ). Il viceversa non è vero, ossia 3 n O(2 n ). Infatti, se esistessero c, n 0 > 0 tali che 0 3 n c2 n per ogni n n 0 allora (dividendo tutto per 2 n ) avremmo con c costante impossibile (3/2) n c per ogni n n 0

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Se f 1 (n) = O(g 1 (n)) ed f 2 (n) = O(g 2 (n)) allora f 1 (n) + f 2 (n) = O(g 1 (n) + g 2 (n)) se f 1 (n) = O(g 1 (n)) allora c 1, n0 1 > 0 tali che 0 f 1 (n) c 1 g 1 (n) per ogni n n 1 0 se f 2 (n) = O(g 2 (n)) allora c 2, n0 2 > 0 tali che 0 f 2 (n) c 2 g 2 (n) per ogni n n 2 0 Sia c = max{c 1, c 2 } ed n 0 = max{n 1 0, n2 0 }. Per ogni n n 0, 0 f 1 (n) + f 2 (n) c 1 g 1 (n) + c 2 g 2 (n) c(g 1 (n) + g 2 (n))

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Se f 1 (n) = O(g 1 (n)) ed f 2 (n) = O(g 2 (n)) allora f 1 (n) f 2 (n) = O(g 1 (n) g 2 (n)) se f 1 (n) = O(g 1 (n)) allora c 1, n0 1 > 0 tali che 0 f 1 (n) c 1 g 1 (n) per ogni n n 1 0 se f 2 (n) = O(g 2 (n)) allora c 2, n0 2 > 0 tali che 0 f 2 (n) c 2 g 2 (n) per ogni n n 2 0 Sia c = c 1 c 2 ed n 0 = max{n 1 0, n2 0 }. Per ogni n n 0, 0 f 1 (n) f 2 (n) (c 1 g 1 (n)) (c 2 g 2 (n)) = c(g 1 (n) g 2 (n))

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O Se f (n) = O(g(n)) allora f (n) k = O(g(n) k ) per ogni k 1 se f (n) = O(g(n)) allora c, n 0 > 0 tali che 0 f (n) cg(n) per ogni n n 0 Elevando tutto alla k e ponendo c = c k > 0 otteniamo 0 f (n) k (cg(n)) k = (c k )g(n) k = c g(n) k per ogni n n 0

Logaritmo vs Lineare Polinomi vs Esponenziali Esponenziali con base diversa Manipolare O f (n) = O(g(n)) implica 2 f (n) = O(2 g (n)), vero o falso? Falso troviamo un controesempio Sappiamo che 2n = O(n) Ma, 2 2n = (2 2 ) n = 4 n O(2 n )