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


Analisi della Complessità degli Algoritmi: Esercizi e Quiz, Appunti di Algoritmi E Strutture Di Dati

Una serie di esercizi e quiz relativi all'analisi della complessità degli algoritmi. Gli argomenti trattati includono la notazione asintotica, il teorema dell'esperto, il metodo divide et impera e la classificazione degli algoritmi in base alla loro complessità. Utile per studenti universitari e per chiunque desideri approfondire la propria conoscenza di questo importante argomento.

Tipologia: Appunti

2021/2022

In vendita dal 24/01/2025

just-little
just-little 🇮🇹

4.5

(2)

9 documenti

1 / 27

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Lezione 3
Tempo di esecuzione di un algoritmo: Numero di operazioni primitive/elementari che
vengono eseguite da un algoritmo.
Dipendono da:
- Dimensione input
- Tipo di input (Se dim è uguale)
Insertion sort
Caso migliore -> T(n)=an+b (Lineare)
Caso peggiore -> T(n)=an^2+bn+c (Quadratica)
caso peggiore di insertion sort `e T(n) = Θ(n2).
Analisi asintotica
- Ignoro il costo Ci di ogni istruzione
- Guardiamo solamente il tasso di crescita di T(n)
“Voglio classificare gli algoritmi in classi di algoritmi aventi complessità simili”
Notazione Θ (Limite asintotico stretto per f(n))
0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) per ogni n ≥ n0
Una funzione f(n) appartiene all’insieme Θ(g(n)) se esistono delle costanti positive c1 e c2
tali che essa possa essere compresa fra c1g(n) e c2g(n)
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b

Anteprima parziale del testo

Scarica Analisi della Complessità degli Algoritmi: Esercizi e Quiz e più Appunti in PDF di Algoritmi E Strutture Di Dati solo su Docsity!

Lezione 3

Tempo di esecuzione di un algoritmo: Numero di operazioni primitive/elementari che vengono eseguite da un algoritmo. Dipendono da:

  • Dimensione input
  • Tipo di input (Se dim è uguale) Insertion sort Caso migliore -> T(n)=an+b (Lineare) Caso peggiore -> T(n)=an^2+bn+c (Quadratica) caso peggiore di insertion sort `e T(n) = Θ(n2). Analisi asintotica
  • Ignoro il costo Ci di ogni istruzione
  • Guardiamo solamente il tasso di crescita di T(n) “Voglio classificare gli algoritmi in classi di algoritmi aventi complessità simili” Notazione Θ (Limite asintotico stretto per f(n)) 0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) per ogni n ≥ n Una funzione f(n) appartiene all’insieme Θ(g(n)) se esistono delle costanti positive c1 e c tali che essa possa essere compresa fra c1g(n) e c2g(n)

Notazione O (Upper Bound) (limite asintotico superiore per f(n)) 0 ≤ f(n) ≤ cg(n) per ogni n ≥ n Per qualsiasi valore n a destra di n0, il valore della funzione f(n) coincide o sta sotto cg(n) Notazione Ω (Lower bound) (limite asintotico inferiore) 0 ≤ cg(n) ≤ f(n) per ogni n ≥ n Per tutti i valori di n a destra di n0, il valore di f(n) coincide o sta sopra cg(n) Analogia con i >=,<=, = “=” -> Θ <= -> O

= -> Ω Teorema: Per ogni coppia di funzioni f(n) e g(n), si ha f(n) = Θ(g(n)) , se e soltanto se f(n) = O(g(n)) e f(n) = Ω(g(n))

Regola:

  • Funzioni logaritmiche crescono più lentamente di funzioni polinomiali
  • Funzioni polinomiali crescono più lentamente di funzioni esponenziali 1 < log n < √n < n < nlog n < n^2 < n^3 < 2^n < n! < x^x Algoritmo addizione binaria: Complessità: Θ(n)

Divide et Impera Basato sulla ricorsione:

  • Se l’istanza può essere risolta direttamente, la risolvo.
  • Altrimenti, la riduco in sottoproblemi in modo da avere più istanze ed arrivare a risolvere direttamente. Si suddivide il problema in vari sottoproblemi, che sono simili al problema originale, ma di dimensioni più piccole, risolvono i sottoproblemi in modo ricorsivo e, poi, combinano le soluzioni per creare una soluzione del problema originale. Divide : il problema viene diviso in un certo numero di sottoproblemi. Impera : i sottoproblemi vengono risolti in modo ricorsivo. Tuttavia, se i sottoproblemi hanno una dimensione sufficientemente piccola, possono essere risolti in maniera semplice. Combina : le soluzioni dei sottoproblemi vengono combinate per generare la soluzione del problema originale. Viene utilizzato prevalentemente in: Importante:
  • Meglio 2 sottoproblemi di dim n/2 che uno di dim n
  • Due round meglio di uno, e così via
  • Divisioni bilanciate sono preferibili a quelle non bilanciate

Il tempo di esecuzione di un algoritmo Divide et Impera può essere espresso come ricorrenza:

  • Se dim in input è piccola allora -> T(n)=Θ(1) (Cioè costante)
  • Se # sottoproblemi = a ed ognuno ha dim 1/b volte l’originale -> aT(n/b), allora:

Albero di ricorsione Θ(n log n)

Metodo dell’esperto

Il metodo dell’esperto rappresenta un “ricettario” per risolvere le ricorrenze della forma: T(n) = aT(n/b) + f(n) ** Il metodo dell’esperto richiede la memorizzazione di tre casi, ma poi la soluzione di molte ricorrenze può essere facilmente determinata, spesso senza carta e penna. ** descrive il tempo di esecuzione di un algoritmo che divide un problema di dimensione n in a sottoproblemi, ciascuno di dimensione n/b, dove a e b sono costanti positive. I sottoproblemi vengono risolti in modo ricorsivo, ciascuno nel tempo T(n/b).

Elevamento a potenza Θ(log n)

Massimo sottoarray Può essere Θ(n) ma Θ(n logn)

Counting inversion Θ(n log n)

RICORDA: Per far si che sono invertibili deve rispettare: A[i]>A[j] e i<j

Quicksort O(n log n)

Prima faccio questa divisione e poi con il quick sort ordino i 2 sottoarray.

Counting sort Θ(n+k)