250 likes | 370 Views
9. 8. 7. 5. 7. 4. 0. 4. 3. 6. 1. 2. 3. 7. 3. 5. 1. 6. 2. 7. 8. 1. 4. 5. 7. 6. 3. 3. 1. 2. 4. 1. 3. 3. 3. 4. 2. 6. 2. 1. 1. 1. 3. 3. 6. 7. 1. 2. 1. 7. 2. 8. 9. 6. 1. 5. 7. 2. 3. 1. 8. 7. 3. 1. 3. 5. 4. 3. 7. 2. 6. 1. 4. 3. 3.
E N D
9 8 7 5 7 4 0 4 3 6 1 2 3 7 3 5 1 6 2 7 8 1 4 5 7 6 3 3 1 2 4 1 3 3 3 4 2 6 2 1 1 1 3 3 6 7 1 2 1 7 2 8 9 6 1 5 7 2 3 1 8 7 3 1 3 5 4 3 7 2 6 1 4 3 3 4 3 2 1 2 6 1 1 3 3 1 2 1 2 Ordinamento dell’array 1 2 3 4 5 6 7 8 9 10 11 12 9 1 8 7 2 3 5 7 4 0 4 5 6 7 4 3 6 1 2 8 9 10 11 12
Max-Heapfy(A,i) l= 2i, r=2i+1 m = i ifl A.heapsizeandA[l] > A[m] m=l ifr A.heapsizeandA[r] > A[m] m=r ifmi t=A[i], A[i] =A[m], A[m] =t Max-Heapfy(A,m)
Build-Max-Heap (A) A.heapsize=A.length fori=A.lenght/2downto 1 Max-Heapfy(A,i)
Heap-Sort(A) Build-Max-Heap(A) fori=A.lengthdownto 2 t=A[i], A[i] =A[1], A[1] =t A.heapsize= A.heapsize - 1 Max-Heapfy(A,1)
Paragonare tra loro algoritmi Abbiamo una scala di complessità: vogliamo inserire ogni algoritmo in questa scala
complessità massima complessità media complessità minima Un algoritmo può richiedere tempi diversi per input della stessa taglia.Ad esempio il tempo per ordinare n oggetti può dipendere dal loro ordine iniziale.
Nell’analizzare la complessità tempo di un algoritmo siamo interessati a come aumenta il tempo al crescere della taglia ndell’input. Siccome per valori “piccoli” di n il tempo richiesto è comunque poco, ci interessa soprattutto il comportamento per valori “grandi” di n(il comportamento asintotico)
Inoltre, siccome la velocità del processore influisce sul tempo calcolo per una costante moltiplicativa noi valuteremo la complessità a meno di una tale costante. Questo giustifica le seguenti definizioni:
Notazione asintotica O (limite superiore asintotico) O(g(n))
Scriveremo f(n) = O(g(n)) per dire che f(n) è una delle funzioni dell’insiemeO(g(n)) f(n) = O(g(n)) si legge: f(n) è “o grande” di g(n) Se f(n) = O(g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che O(g(n)) è un limite superiore asintotico per la complessità tempo di tale algoritmo.
infatti per c = 4 ed n0= 5 Vedremo che in generale per a2> 0 infatti per c = 3 ed n0= 1 esempi
Notazione asintotica . (limite inferiore asintotico)
Scriveremo f(n) = (g(n)) per dire che f(n) è una delle funzioni dell’insieme (g(n)). f(n) = (g(n)) si legge: f(n) è “omega” di g(n) Se f(n) = (g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che (g(n)) è un limite inferiore asintotico per la complessità tempo di tale algoritmo.
infatti per c = 1 ed n0= 10 Vedremo che in generale se a2> 0 infatti per c = 1 ed n0= 1 esempi
Notazione asintotica . (limite asintotico stretto)
Scriveremo f(n) = (g(n)) per dire che f(n) è una delle funzioni dell’insieme (g(n)). f(n) = (g(n)) si legge: f(n) è “theta” di g(n) Se f(n) = (g(n)) rappresenta il tempo calcolo richiesto da un algoritmo diciamo che (g(n)) è un limite asintotico stretto per la complessità tempo di tale algoritmo.
per c1 = 1, c2 = 4 ed n0= 10 Dunque esempi Dunque
altrimenti per ogni n n0 allora per ogni n n0.Assurdo! altrimenti per ogni n n0allora per ogni n n0.Assurdo!
allora per ogni > 0 esiste n0 tale che pern≥n0 e quindi Metodo del limite Spesso è possibile determinare dei limiti asintotici calcolando il limite di un rapporto. Ad esempio se Preso 0 <<k e posto c1 = k e c2 = k +
ed in questo caso Se diciamo che ed in questo caso Se diciamo che Attenzione: quando il limite del rapporto non esiste questo metodo non si può usare.
In generale per ogni funzione polinomiale di grado k con coefficiente ak > 0. Inoltre
Valutare la difficoltà dei problemi esiste un algoritmo che risolve il problema con questa complessità limite superiore: O(n2)
Un limite superiore per il problema dell’ordinamento Abbiamo visto che Insert-Sort per ordinare n oggetti richiede O(n2) operazioni Quindi O(n2) è un limite superiore
Valutare la difficoltà dei problemi ogni algoritmo che risolve il problema ha complessità maggiore o uguale di questa limite inferiore: (n)