Progetto di algoritmi: metodologia "Divide et Impera" Il problema è risolto attraverso la sua scomposizione in problemi di taglia inferiore Divide: Problema suddiviso in un numero di sottoproblemi di taglia inferiore Impera: Sottoproblemi risolti ricorsivamente o direttamente se di dimensione piccola a sufficienza Combina: Le soluzioni dei sottoproblemi sono combinate per ottenere la soluzione al problema originale Divide et impera
Merge Sort Divide: divide gli n elementi da ordinare in due sottosequenze da n/2 elementi. Costo: O(n) Impera: ordina ricorsivamente usando il merge sort le due sottosequenze. Costo: 2f(n/2) Combina: fonde le due sottosequenze ordinate. Costo: O(n) La ricorsione termina quando si hanno solo due elementi da ordinare. Costo:O(1) Divide et impera
Costo dell’algoritmo Merge Sort: void mergesort(int[] A, int first, int last) { if (first < last) { int mid = (first + last) / 2; mergesort(A, first, mid); mergesort(A, mid+1, last); merge(A, first, last); } void merge(int[] data, int first, int last) { int mid = (first + last) / 2; int i1 = 0, i2 = first, i3 = mid + 1; int[] temp = new int[last – first + 1]; while (i2 <= mid && i3 <= last) if (data[i2] < data[i3]) temp[i1++] = data[i2++]; else temp[i1++] = data[i3++]; while (i2 <= mid) while (i3 <= last) temp[i1++] = data[i3++]; for (i1 = 0, i2 = first; i2 <= last; data[i2++] = temp[i1++]); } Costo dell’algoritmo Merge Sort: Divide et impera
Equazioni di ricorrenza Tempo di esecuzione di algoritmi ricorsivi descritti con equazioni di ricorrenza. Ex: MergeSort: Semplificazioni Argomenti non interi Condizioni al contorno: (1) per n piccolo Divide et impera
Soluzione di equazioni di ricorrenza Metodo per sostituzione. Si tenta una soluzione e si verifica se soddisfa l’equazione di ricorsione. Ex: Merge Sort: Divide et impera
Esercizi Mostrare che la soluzione di f(n)=f(n/2)+1 è O(log n) Mostrare che la soluzione di f(n)=2f((n/2)+17)+n è O(n log n) Divide et impera
esempio si ipotizza la soluzione induzione matematica per trovare costanti e mostrare che la soluzione funziona tecnica usata sia per upper/lower bound proviamo che f(n) <= cn lg n per una c appropriata assumiamo che funzioni per n/2 e sostituendo otteniamo f(n) <= c n lg n verifica delle condizioni al contorno (per n = 1, o almeno n > n0) Divide et impera