TECNICA DIVIDE ET IMPERA Soluzione2: Algoritmo Merge-Sort 05 1 2 28 20 34 47 51 69 73 82 96 05 2 48 50 74 87 25 52 8 25 52 5 2 1 29 3 62 9 6 047 8 04 0 1 39 93 7 4 19 1 26 3 9 2 6 Merge-Sort(A,p,r) if p < r q = (p+r)/2 Merge-Sort(A,p,q) Merge-Sort(A,q+1,r) Merge(A,p,q,r) A[p..q] A[q+1..r] 024578 12369 L 024578 R 12369 01223456789 A[p..r] Merge(A,p,q,r) n1 = q – p + 1 n2 = r – q for i = 1 to n1 L[i] = A[p + i – 1] for j = 1 to n2 R[j] = A[q + j] L[n1 + 1] = R[n2 + 1] = i=j=1 for k = p to r if L[i] R[j] A[k] = L[i] i=i+1 else A[k] = R[j] j=j+1 Analisi di Merge-Sort: correttezza Merge-Sort(A,p,r) A 1 p non ordinati r n r n r n if p < r // altrimenti A[p..r] è ordinato q = (p+r)/2 Merge-Sort(A,p,q) Merge-Sort(A,q+1,r) A 1 p ordinati ordinati q Merge(A,p,q,r) A 1 p ordinati Merge(A,p,q,r) A n1 = q – p + 1 n2 = r – q for i = 1 to n1 L[i] = A[p + i – 1] for j = 1 to n2 R[j] = A[q + j] L[n1 + 1] = R[n2 + 1] = A L i=j=1 for k = p to r if L[i] R[j] A[k] = L[i] i=i+1 else A[k] = R[j] j=j+1 A L 1 p 1 p q ∞ 1 n1 p 1 ∞ 1 A L 1 1 R n r n ∞ 1 n2 r k n1 i r R 1 p n ∞ n2 j rk ∞ n1 i R 1 n ∞ n2 j Merge(A,p,q,r) // complessità n1 = q – p + 1 n2 = r – q for i = 1 to n1 L[i] = A[p + i – 1] for j = 1 to n2 R[j] = A[q + j] L[n1 + 1] = R[n2 + 1] = i=j=1 for k = p to r if L[i] R[j] A[k] = L[i] i=i+1 else A[k] = R[j] j=j+1 // // // // // // // // // // // // // c1 c2 c3 c4 n1 1 c5 n1 c4 n2 1 c5 n2 c6 c7 c8 n 1 c9 n c10n1 c11n1 // c10n2 // c11n2 T M (n) (c4 c5 c8 c9 c10 c11 )n c1 c2 c3 2c4 c6 c7 c8 a ' n b' n r p 1 q ( p r ) / 2 n1 n / 2 n2 n / 2 n n1 n2 Merge-Sort(A,p,r) //complessità if p < r q = (p+r)/2 Merge-Sort(A,p,q) Merge-Sort(A,q+1,r) Merge(A,p,q,r) T MS // // // // // // c1 c2 c3 T MS n1 T MS n2 T M n a' n b' n r p 1 n1 q p 1 n2 r q n n1 n2 se n 1 c1 c2 ( n) MS MS M c1 c2 c3 T (n1 ) T (n2 ) T (n) se n 1 T MS se n 1 c ( n) MS MS an b T ( n ) T (n2 ) se n 1 1 T log 2 n MS se n 1 c n MS MS n2 se n 1 T n T b an 1 T MS n1 an b an1 b T MS n1,1 an1,1 b T MS n1, 2 an1, 2 b an b T MS n2 an2 b T MS n2,1 an2,1 b T MS n2,2 an2, 2 b c c c c c c c c c c c c MSMS TT nn a' nan loglog b' nbc('n 1) cn 2 n 2n an 2b an 4b cn T MS n a' n log 2 n b' n c' IS Tmed (n) a" n 2 b" n c" T n a' n log 2 n b' n c' lim n IS lim n 0 2 Tmed n a" n b" n c" MS Dunque esiste N tale che per ogni n > N. IS n T MS n Tmed Qualunque siano i valori delle costanti a', b', c', a", b" e c" l’algoritmo Merge-Sort è superiore a Insertion-Sort per array di dimensione sufficientemente grande. Possiamo dire che T n “cresce come” n2 MS n “cresce come” n log2 n. T mentre IS MS n n2 n log2 n n2 ns n log2 n ns IS med 10 100 100 10000 1000 106 10000 108 106 1012 109 1018 33 0.1s 0.033s 664 9965 10s 1ms 0.664s 10s 132877 0.1s 2·107 17m 3·1010 70anni 133s 20ms 30s T n a' n log 2 n b' n c' lim n IS lim n Tmin n a" n b" MS IS n dunque esiste N tale che T MS n Tmin per ogni n > N. Qualunque siano i valori delle costanti a', b', c', a", b" l’algoritmo Insertion-Sort è superiore a Merge-Sort per array (quasi) ordinati e sufficientemente grandi. Insertion-Sort è anche superiore a Merge-Sort per MS n T array piccoli in quanto le costanti a', b', c' in sono generalmente molto maggiori delle costanti IS T a", b" e c" in max n . Questo suggerisce una modifica di Merge-Sort in cui le porzioni di array di dimensione minore di una certa costante k si ordinano con Insertion-Sort invece di usare ricorsivamente Merge-Sort. Soluzione3: Algoritmo Merge-Ins-Sort Merge-Ins-Sort(A,p,r) if p < r if r-p+1 < 32 InsertSort(A,p,r) else q = (p+r)/2 Merge-Ins-Sort(A,p,q) Merge-Ins-Sort(A,q+1,r) Merge(A,p,q,r)