1 / 8

Analisi asintotica

Analisi asintotica. Se si considerano tutte le costanti l’analisi può divenire eccessivamente complessa In realtà interessa conoscere come varia il costo al variare della dimensione dell’input , a meno di costanti

nevan
Télécharger la présentation

Analisi asintotica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Analisi asintotica • Se si considerano tutte le costanti l’analisi può divenire eccessivamente complessa • In realtà interessa conoscere come varia il costo al variare della dimensione dell’input, a meno di costanti • Motivo: il costo è comunque calcolato a meno di costanti, per le ipotesi fatte circa il modello • Un’analisi di questo tipo è detta asintotica • L’analisi asintotica trascura i fattori costanti • L’analisi asintotica è influenzata dall’operazione dominante di un algoritmo • L'operazione eseguita "più frequentemente" (concetto da chiarire) Analisi asintotica

  2. Analisi asintotica /2 • f(n), g(n) funzioni non negative e non decrescenti, dagli interi ai reali • f(n) = O(g(n)) se esistono c > 0 reale e una costante intera n0 >= 1 tali che f(n) <= c·g(n), per n >= n0(f cresce al più come g) • f(n) = Ω(g(n)) se esistono c > 0 reale e una costante intera n0 >= 1 tali che f(n) >= c·g(n), per n >= n0 (f cresce almeno come g) • f(n) = Θ(g(n)) se f(n) = O(g(n)) e f(n) = Ω(g(n)) (f cresce come g) • f(n) = o(g(n)) se limn f(n)/g(n) = 0 • f(n) = ω(g(n)) se g(n) = o(f(n)) Analisi asintotica

  3. Esempi • L’algoritmo arrayMaxha costo Θ(n) • f(n) = 3n2 + 10n = O(n2) per c = 4 e n0 >= 10, 3n2 + 10n <= 4n2 • f(n) = n2/2 – 3n = Θ(n2) per c1 = 1/14, c2 = 1/2, n0 >= 7: c1n2 <= n2/2 – 3n <= c2n2 D.: Cosa significa O(1)? Analisi asintotica

  4. Operazione dominante • Un’operazione di un algoritmo di costo f(n) si dice dominante se, per ogni n, essa viene eseguita, nel caso peggiore di input di dimensione n, un numero di volte d(n) che soddisfa: f(n) < a·d(n) + b per opportune costanti reali a e b • Ex.: istruzione if (A[i] > currentMax) nell’algoritmo arrayMax(A, n) Analisi asintotica

  5. Analisi asintotica /3 • Limiti dell’approccio "analisi asintotica di caso peggiore" • Le costanti nascoste possono essere molto grandi: un algoritmo con costo 1050n è lineare ma potrebbe essere poco pratico • Comportamento nel caso di istanze “piccole” (es. 3n contro n2)? • Il caso peggiore potrebbe verificarsi raramente Analisi asintotica

  6. Analisi di Insertion Sort Ex: 5 4 3 2 1 i=0 5 4 3 2 1 0 confronti i=1 4 5 3 2 1 1 confronto i=2 3 4 5 2 1 2 confronti i=3 2 3 4 5 1 3 confronti i=4 1 2 3 4 5 4 confronti Ex: 1 2 3 4 5 f(n) = n Algorithm insertionSort(A, n) for (i=0; i<n; i++) { tmp=A[i]; for (j=i; j>0 && tmp<A[j-1]; j--) A[j]=A[j-1]; A[j] = tmp; } return A; Ordina in modo non-decrescente Inserisce l’elemento A[i] nella posizione corretta nel vettore ordinato A[0,…,i-1] Operazione dominante: una qualunque fra quelle eseguite nel for più interno D.: se la ricerca della posizione di A[i] in A[0,…,i-1] avvenisse con la ricerca binaria? Analisi asintotica

  7. Esempi Valutare la complessità dei tre metodi class esercizio { public void Ex1(int n) { int a, i; for (i = 0; i < n; i++) a = i; } public void Ex2(int n) { int a, i; for (i = 0; i < n * n; i++) a = i; } public void Ex3(int n) { int a, i, j; for (i = 0; i < n; i++) for (j = 0; j <= i; j++) a=i; } } Complessità di Ex3: 1+ 2 + … + n = O(n2) qual è la dimensione dell'input?? Analisi asintotica

  8. Calcolo delle somme dei prefissi • Dato un vettore di interi X[0....n-1], determinare le componenti del vettore A[0...n-1] in modo tale che A[i]=X[0]+....+X[i-1] + X[i]. Due algoritmi: Algorithm prefix2(X, n) A[0]=X[0]; for (i=1; i<n; i++) A[i]=A[i-1]+X[i]; return A; Algorithm prefix1(X, n) for (i=0; i<n; i++) { A[i]=0; for (j=0; j<=i; j++) A[i]=A[i]+X[j]; } return A; O(n) O(n2) Analisi asintotica

More Related