Asd 01 Algoritmi E Strutture Dati

2,425 views
2,325 views

Published on

Corso di Algoritmi e Strutture Dati 2008/2009
Politecnico di Milano
Prof. Pier Luca Lanzi

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,425
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
70
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Asd 01 Algoritmi E Strutture Dati

  1. 1. Algoritmi e Strutture Dati Introduzione Prof. Pier Luca Lanzi
  2. 2. Riferimenti 2  Questo materiale è tratto dalle trasparenze del corso Introduction to Algorithms (2005-fall-6046) tenuto dal Prof. Leiserson all’MIT (http://people.csail.mit.edu/cel/)  T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein Introduction to Algorithms, Second Edition, The MIT Press, Cambridge, Massachusetts London, England McGraw-Hill Book Company  Queste trasparenze sono disponibili sui siti http://webspace.elet.polimi.it/lanzi http://www.slideshare.net/pierluca.lanzi Prof. Pier Luca Lanzi
  3. 3. Algoritmi & strutture dati
  4. 4. Cos’è un algoritmo? 4  “Sequenza di passi, definiti con precisione, che portano alla realizzazione di un compito”  La sequenza di passi deve essere finita e deve portare ad un risultato  Le istruzioni devono essere eseguibili materialmente e devono essere espresse in modo non ambiguo  Un algoritmo deve essere comprensibile al suo esecutore, corretto, ed efficiente  Forniscono descrizione astratta di un metodo (procedimento) per giungere alla soluzione di un dato problema Prof. Pier Luca Lanzi
  5. 5. Un po’ di storia 5  Al-Khwārizmī, astronomo e matematico Persiano, nell’825 scrive il trattato “On Calculation with Hindu Numerals”  Tradotto in latino nel XII secolo, come “Algoritmi de numero Indorum”  “Algoritmi” era la traduzione del nome dell’autore (Al-Khwārizmī) ma il termine è stato frainteso come il plurare Latino algorismus  Nel 1240, il termine è usato in nel manuale “Carmen de Algorismo” di Alexandre de Villedieu. Francobollo emesso il 6 Settembre 1983 dall’Unione Sovietica per commemorare il “compleanno di Al-Khwārizmī's (780-850) Prof. Pier Luca Lanzi
  6. 6. Quali sono gli obiettivi del corso? 6 Analisi e design di algoritmi  Analisi degli algoritmi noti per il design di algoritmi nuovi  Analisi degli algoritmi Performance (velocità) Utilizzo delle risorse (memoria e comunicazione)  Ci sono molti altri aspetti (non trattati qui): Correttezza, robustezza, mantenibilità Modularità, sicurezza, facilità d’uso Prof. Pier Luca Lanzi
  7. 7. 7 Perchè algoritmi e performance? La performance spesso determina il confine tra quello che è possibile e quello che non è possibile fare L’analisi degli algoritmi ci aiuta a capire il concetto di scalabilità Prof. Pier Luca Lanzi
  8. 8. 8 Scalabilità? Prof. Lanzi corre i 100m in 12s In quanto corre la maratona? Prof. Pier Luca Lanzi
  9. 9. Esempio: Ricerca di un elemento 9  Dato un elenco contenente n oggetti, cercare se un oggetto x è presente  L’elenco non è ordinato x? x? x? x? x? x!  Caso migliore? Quello che cerco è il primo  Caso peggiore? Ho n elementi e quello che cerco è l’ultimo  Caso medio? Circa n/2 Prof. Pier Luca Lanzi
  10. 10. Codifica in C++ 10 bool linear_find(int v[], int n, int x) { int i; for (i=0; i<n && v[i]!=x; i++); if (i==n) return false; else return true; } Prof. Pier Luca Lanzi
  11. 11. Esempio: Ricerca di un elemento 11  Supponiamo ora che l’elenco sia ordinato alfabeticamente  Esempio: l’elenco del telefono o un dizionario Rossi? A B C ... N ... ... ... Z  Caso migliore? Quello che cerco è il primo  Caso peggiore?  Caso medio? Prof. Pier Luca Lanzi
  12. 12. Codifica in C++ 12 bool binary_find(int v[], int n, int x) { int l = -1; int r = n; // l, r are beyond array bounds while (l+1 != r) { // Stop when l, r meet int i = (l+r)/2; // Check middle if (x < array[i]) r = i; // Left half if (x == array[i]) return true; // Found it if (x > array[i]) l = i; // Right half } return false; // Search value not in array } Prof. Pier Luca Lanzi
  13. 13. 13 E le strutture dati? Gli algoritmi lavorano su dati che vengono organizzati secondo una certa struttura Se la struttura è efficiente allora gli algoritmi sono più efficienti Prof. Pier Luca Lanzi
  14. 14. 14 La ricerca binaria è sempre più efficiente? Prof. Pier Luca Lanzi
  15. 15. Struttura Dati?  Organizzazione o collezione di elementi (o record) su cui sia possibile processare le informazioni, effettuare una ricerca, ecc.  La scelta della struttura dati e dell’algoritmo adeguati può ridurre i tempi di esecuzione da giorni a pochi secondi. Lo stesso vale per altre risorse.  Efficienza: una soluzione è efficiente se risolve un problema dato entro i vincoli di memoria e tempo di esecuzione richiesti. Prof. Pier Luca Lanzi
  16. 16. Quale Struttura Dati?  Tre semplici passi  Analizzare il problema per determinare i vincoli sulle risorse che è necessario soddisfare (Memoria? Velocità? Entrambi?)  Determinare quali sono le operazioni che devono essere supportate quantificando le risorse per ogni operazione  Selezionare la struttura dati che meglio soddisfa i requisiti  Alcune domande, I dati sono inseriti tutti all’inizio o mano a mano? È possibile cancellare degli elementi? I dati sono processati sequenzialmente o in ordine qualunque? Prof. Pier Luca Lanzi
  17. 17. 17 Ogni struttura dati ha costi/benefici Raramente c’è una soluzione che va bene in tutte le situazioni Costo per memorizzare un elemento, tempo di esecuzione per le operazioni di base, effort per l’implementazione Prof. Pier Luca Lanzi
  18. 18. Ordinamento Input: sequenza a1, a2, …, an di numeri. Output: permutazione a'1, a'2, …, a'n che soddisfi la relazione a'1 a'2 … a' n Esempio: Input: 8 2 4 9 3 6 Output: 2 3 4 6 8 9 Prof. Pier Luca Lanzi L1.18
  19. 19. Insertion Sort INSERTION-SORT (A, n) ⊳ A[1 . . n] for j ← 2 to n do key ← A[ j] i←j–1 “pseudo codice” while i > 0 and A[i] > key do A[i+1] ← A[i] i←i–1 A[i+1] = key 1 i j n A: key sorted Prof. Pier Luca Lanzi
  20. 20. Esempio di Insertion Sort 8 2 4 9 3 6 Prof. Pier Luca Lanzi
  21. 21. Esempio di Insertion Sort 8 2 4 9 3 6 Prof. Pier Luca Lanzi L1.21
  22. 22. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 Prof. Pier Luca Lanzi
  23. 23. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 Prof. Pier Luca Lanzi
  24. 24. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 Prof. Pier Luca Lanzi
  25. 25. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 Prof. Pier Luca Lanzi
  26. 26. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 Prof. Pier Luca Lanzi
  27. 27. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 Prof. Pier Luca Lanzi
  28. 28. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 Prof. Pier Luca Lanzi
  29. 29. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 Prof. Pier Luca Lanzi
  30. 30. Esempio di Insertion Sort 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 2 3 4 6 8 9 Fatto! Prof. Pier Luca Lanzi
  31. 31. Tempo di Esecuzione  Dipende dall’input Dal numero di elementi Dallo stato del vettore, una sequenza già ordinata richiede meno tempo  Calcolare il tempo di esecuzione parametrizzandolo rispetto al numero di elementi di input (vettori più piccoli richiedono meno tempo)  Cerchiamo limiti superiori al tempo di esecuzione dato che danno una garanzia sul tempo massimo richiesto Prof. Pier Luca Lanzi
  32. 32. Quale Tipo di Analisi? L1.32  Caso Pessimo (worst-case): (tipico) T(n) tempo massimo per un input di n elementi  Caso Medio (average-case): (raramente disponibile) T(n) tempo medio per un input di n elementi Problema: Qual è la distribuzione degli input?  Caso Migliore (best-case): (non informativo) Algoritmi lenti possono essere molto veloci in casi particolarmente favorevoli Prof. Pier Luca Lanzi
  33. 33. Quale Tempo di Esecuzione? L1.33  Qual è T(n) nel caso pessimo per l’insertion sort?  Dipende dalla velocità della macchina su cui viene eseguito Velocità relativa (diversi algoritmi, stessa macchina) Velocità assoluta (su macchine differenti) Non considerare una particolare macchina Studiare T(n) per n → ∞ Analisi Asintotica Prof. Pier Luca Lanzi
  34. 34. Analisi asintotica
  35. 35. Andamento Asintotico per T(n) 35 Prof. Pier Luca Lanzi
  36. 36. Computer più veloci o algoritmi più veloci? Quanto guadagno se compero un calcolatore 10 volte più veloce? T(n) n n’ Change n’/n 10n 1,000 10,000 n’ = 10n 10 20n 500 5,000 n’ = 10n 10 5n log n 250 1,842 10 n < n’ < 10n 7.37 2n2 70 223 n’ = 10n 3.16 2n 13 16 n’ = n + 3 ----- Prof. Pier Luca Lanzi
  37. 37. 37 Per a, b > 1 qualsiasi na cresce più velocemente di logb n (meglio logaritmico che polinomiale) na cresce più velocemente di log nb (meglio potenza di un logaritmo che un polinomio) an cresce più velocemente nb (meglio polinomiale che esponenziale) Prof. Pier Luca Lanzi
  38. 38. Analisi Asintotica: Notazione O-grande  Definizione: sia T(n) una funzione non-negativa, T(n) è O(f(n)) se esistono due costanti positive c ed n0 tali che T(n) <= cf(n) per ogni n> n0  Per tutti i gli insiemi di dati di input grandi a sufficienza, (n>n0), l’algoritmo termina la sua esecuzione in meno di cf(n) passi (nel caso migliore, medio, o peggiore).  La notazione O-grande indica un limite superiore a T(n)  Esempio: se T(n) = 3n2 allora T(n) è in O(n2)  Ovviamente siamo interessati al minimo limite superiore, se T(n) = 3n2 è O(n3), ma preferiamo O(n2) Prof. Pier Luca Lanzi
  39. 39. Analisi Asintotica: Notazione Ω-grande  Definizione: sia T(n) una funzione non-negativa, T(n) è Ω(g(n)) se esistono due costanti positive c ed n0 tali che T(n) >= cg(n) per ogni n> n0  Per tutti i gli insiemi di dati di input grandi a sufficienza, (n>n0), l’algoritmo ha bisogno almeno di cg(n) passi (nel caso migliore, medio, o peggiore).  La notazione Ω-grande indica un limite inferiore a T(n)  Esempio: se T(n) = 2n2+n allora T(n) è in Ω(n2)  Ovviamente siamo interessati al massimo limite inferiore, T(n) = 2n2+n è Ω(n), ma preferiamo Ω(n2) Prof. Pier Luca Lanzi
  40. 40. Analisi Asintotica: Notazione Θ-grande  Definizione: se T(n) è Ω(h(n)) e anche O(h(n)) allora T(n) è Θ(h(n))  Ovvero, se esistono due costanti c1 e c2, ed n0 tali che c1g(n) ≤ f(n) ≤ c2g(n) per ogni n>n0 Prof. Pier Luca Lanzi
  41. 41. Analisi Asintotica Per n grande, un algoritmo (n2) è sempre più veloce di un algoritmo (n3)  Vero asintoticamente!  Non dovremmo ignorare gli algoritmi che sono asintoticamente lenti  Nelle situazioni reali bisogna T(n) spesso bilanciare obiettivi contrapposti  Tipico esempio, performance vs. complessità n n0 Prof. Pier Luca Lanzi
  42. 42. Andamento Asintotico per T(n) 42 Prof. Pier Luca Lanzi
  43. 43. Regole di Semplificazione  Se f(n) è O(g(n)) e g(n) è O(h(n)), allora f(n) è O(h(n))  Se f(n) è O(kg(n)) per ogni k>0, allora f(n) è O(g(n))  Se f1(n) è O(g1(n)) ed f2(n) è O(g2(n)), allora (f1 + f2)(n) è O(max(g1(n), g2(n)))  Se f1(n) è O(g1(n)) ed f2(n) è O(g2(n)), allora f1(n)f2(n) è O(g1(n)g2(n))  In breve, eliminare i termini di ordine inferiore, ignorare le costanti. Prof. Pier Luca Lanzi
  44. 44. Esempi di Analisi Asintotica  Esempio 1: a = b;  Esempio 2: sum = 0; for (i=1; i<=n; i++) sum += n; Prof. Pier Luca Lanzi
  45. 45. Esempi di Analisi Asintotica  Esempio 3: sum = 0; for (i=1; i<=n; j++) for (j=1; j<=i; i++) sum++; for (k=0; k<n; k++) A[k] = k; Prof. Pier Luca Lanzi
  46. 46. Esempi di Analisi Asintotica  Esempio 4: sum1 = 0; for (i=1; i<=n; i++) for (j=1; j<=n; j++) sum1++; sum2 = 0; for (i=1; i<=n; i++) for (j=1; j<=i; j++) sum2++; Prof. Pier Luca Lanzi
  47. 47. Esempi di Analisi Asintotica  Esempio 5: sum1 = 0; for (k=1; k<=n; k*=2) for (j=1; j<=n; j++) sum1++; sum2 = 0; for (k=1; k<=n; k*=2) for (j=1; j<=k; j++) sum2++; Prof. Pier Luca Lanzi
  48. 48. Strutture di Controllo  Istruzione while: viene analizzato come il ciclo for  Istruzione if: complessità del blocco più costoso  Istruzione switch: complessità del caso più costoso  Chiamata a subroutine: complessità della subroutine Prof. Pier Luca Lanzi
  49. 49. Qual è la Complessità Insertion Sort INSERTION-SORT (A, n) ⊳ A[1 . . n] for j ← 2 to n do key ← A[ j] i←j–1 while i > 0 and A[i] > key do A[i+1] ← A[i] i←i–1 A[i+1] = key Prof. Pier Luca Lanzi
  50. 50. Analisi Asintotica dell’Insertion Sort 50  Caso Peggiore: n T(n) ( j) n2 j 2  Caso Medio: (tutte le possibili permutazioni siano equiprobabili) n T(n) ( j / 2) n2 j 2  È un algoritmo veloce? Si, per n piccoli No, per n grandi Prof. Pier Luca Lanzi
  51. 51. Cosa Succede Se Abbiamo Più Parametri?  Calcoliamo la frequenza di tutti i C colori in un’immagine di P pixel for (i=0; i<C; i++) // Initialize count count[i] = 0; for (i=0; i<P; i++) // Look at all pixels count[value(i)]++; // Increment count sort(count); // Sort pixel counts  Se usiamo P come parametri, allora T(n) = (P log P).  È più accurato T(n) = (P + C log C). Prof. Pier Luca Lanzi
  52. 52. Merge Sort MERGE-SORT A[1 . . n] 1. If n = 1, done. 2. MERGE-SORT A[ 1 . . n/2 ] 3. MERGE-SORT A[ n/2 +1 . . n ] 4. merge the two sorted arrays A[ 1 . . n/2 ] and A[ n/2 +1 . . n ] Punto chiave: il merge dei due vettori Prof. Pier Luca Lanzi
  53. 53. Merge di Due Vettori Ordinati 20 12 13 11 7 9 2 1 Prof. Pier Luca Lanzi
  54. 54. Merge di Due Vettori Ordinati 20 12 13 11 7 9 2 1 1 Prof. Pier Luca Lanzi
  55. 55. Merge di Due Vettori Ordinati 20 12 20 12 13 11 13 11 7 9 7 9 2 1 2 1 Prof. Pier Luca Lanzi
  56. 56. Merge di Due Vettori Ordinati 20 12 20 12 13 11 13 11 7 9 7 9 2 1 2 1 2 Prof. Pier Luca Lanzi
  57. 57. Merge di Due Vettori Ordinati 20 12 20 12 20 12 13 11 13 11 13 11 7 9 7 9 7 9 2 1 2 1 2 Prof. Pier Luca Lanzi
  58. 58. Merge di Due Vettori Ordinati 20 12 20 12 20 12 13 11 13 11 13 11 7 9 7 9 7 9 2 1 2 1 2 7 Prof. Pier Luca Lanzi
  59. 59. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 Prof. Pier Luca Lanzi
  60. 60. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 Prof. Pier Luca Lanzi
  61. 61. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 Prof. Pier Luca Lanzi
  62. 62. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 Prof. Pier Luca Lanzi
  63. 63. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 Prof. Pier Luca Lanzi
  64. 64. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 12 Prof. Pier Luca Lanzi
  65. 65. Merge di Due Vettori Ordinati 20 12 20 12 20 12 20 12 20 12 20 12 13 11 13 11 13 11 13 11 13 11 13 7 9 7 9 7 9 9 2 1 2 1 2 7 9 11 12 Il merge è Θ(n) Prof. Pier Luca Lanzi
  66. 66. Insertion Sort vs Merge Sort 67  InsertionSort Ha un approccio incrementale A[1..j-1] ordinato, aggiungi A[j]  MergeSort Ha un approccio divide-et-impera  Divide: Divide il vettore di n elementi in due array di n/2 elementi  Impera: Chiama il MergeSort ricorsivamente su i due array  Combina: Fa il merge delle due sequenze ordinate Prof. Pier Luca Lanzi
  67. 67. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una constante Prof. Pier Luca Lanzi
  68. 68. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una constante T(n) Prof. Pier Luca Lanzi L1.69
  69. 69. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una constante cn T(n/2) T(n/2) Prof. Pier Luca Lanzi
  70. 70. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una constante cn cn/2 cn/2 T(n/4) T(n/4) T(n/4) T(n/4) Prof. Pier Luca Lanzi
  71. 71. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn/2 cn/2 cn/4 cn/4 cn/4 cn/4 (1) Prof. Pier Luca Lanzi
  72. 72. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn/2 cn/2 h = log n cn/4 cn/4 cn/4 cn/4 (1) Prof. Pier Luca Lanzi
  73. 73. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn cn/2 cn/2 h = log n cn/4 cn/4 cn/4 cn/4 (1) Prof. Pier Luca Lanzi
  74. 74. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn cn/2 cn/2 cn h = log n cn/4 cn/4 cn/4 cn/4 (1) Prof. Pier Luca Lanzi
  75. 75. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn cn/2 cn/2 cn h = log n cn/4 cn/4 cn/4 cn/4 cn … (1) Prof. Pier Luca Lanzi
  76. 76. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn cn/2 cn/2 cn h = log n cn/4 cn/4 cn/4 cn/4 cn … (1) n elementi (n) Prof. Pier Luca Lanzi
  77. 77. Analisi Asintotica del Merge Sort Calcolare T(n) = 2T(n/2) + cn, dove c > 0 è una costante cn cn cn/2 cn/2 cn h = log n cn/4 cn/4 cn/4 cn/4 cn … (1) n elementi (n) Total (n log n) Prof. Pier Luca Lanzi
  78. 78. 79 Θ(nlogn) cresce più lentamente di Θ(n2) Asintoticamente il merge sort è meglio dell’insertion sort In pratica il merge sort è conveniente per n>30 Prof. Pier Luca Lanzi
  79. 79. Notazioni o & ω 80  La notazione O-grande e Ω-grande sono basate sulle disuguaglianze ≤ e ≥  La notazione o-piccolo e ω sono basate su disuguaglianze strette < e > Prof. Pier Luca Lanzi
  80. 80. Sommario
  81. 81. Sommario  Algoritmo: “Sequenza di passi, definiti con precisione, che portano alla realizzazione di un compito”  Struttura Dati: Organizzazione o collezione di elementi (o record) su cui sia possibile processare le informazioni, effettuare una ricerca, ecc.  La scelta della struttura dati e dell’algoritmo adeguati può ridurre i tempi di esecuzione da giorni a pochi secondi.  Analisi asintotica su performance (tempo di esecuzione T(n)) notazione O, Ω, e Θ  Esempi di Insertion Sort and Merge Sort Prof. Pier Luca Lanzi

×