Esercizi Capitolo 12 - Divide-et-Impera
|
|
|
- Dario Ferrari
- 8 anni fa
- Visualizzazioni
Transcript
1 Esercizi Capitolo 12 - Divide-et-Impera Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare alle rispettive soluzioni tramite collegamenti ipertestuali. Altrimenti, fate riferimento ai titoli degli esercizi. Ovviamente, si consiglia di provare a risolvere gli esercizi personalmente, prima di guardare la soluzione. Per molti di questi esercizi l ispirazione è stata presa dal web. In alcuni casi non è possibile risalire alla fonte originale. Gli autori originali possono richiedere la rimozione di un esercizio o l aggiunta di una nota di riconoscimento scrivendo ad [email protected]. 1 Problemi 1.1 Analisi Quicksort (Esercizio 12.4 del libro) Si analizzi la complessità di QuickSort() nel caso in cui tutti gli elementi del vettore da ordinare abbiano lo stesso valore. Soluzione: Sezione Merge Sort iterativo (Esercizio 12.5 del libro) Si fornisca una versione iterativa della procedura MergeSort() senza usare una pila e mantenendone la complessità di O(n log n). Soluzione: Sezione Prodotto di numeri complessi (Esercizio 12.8 del libro) Si individui un algoritmo per moltiplicare due numeri complessi usando solo tre operazioni aritmetiche di moltiplicazione anziché quattro. Soluzione: Sezione Chi manca? (Esercizio del libro) Sia dato un vettore ordinato A[1... n] contenente n elementi interi distinti appartenenti all intervallo 1... n + 1. Si scriva una procedura, basata sulla ricerca binaria, per individuare in tempo O(log n) l unico intero dell intervallo 1... n + 1 che non compare in A. Soluzione: Sezione 2.4 1
2 1 PROBLEMI Punto fisso Progettare un algoritmo che, preso un vettore ordinato A di n interi distinti, determini se esiste un indice i tale che A[i] = i in tempo O(log n). Soluzione: Sezione Ricerca in vettori unimodulari Un vettore di interi A è detto unimodulare se ha tutti valori distinti ed esiste un indice h tale che A[1] > A[2] >... > A[h 1] > A[h] e A[h] < A[h + 1] < A[h + 2] <... < A[n], dove n è la dimensione del vettore. Progettare un algoritmo che dato un vettore unimodulare restituisce il valore minimo del vettore. La complessità dell algoritmo deve essere O(log n). Soluzione: Sezione Merge coprocessor Supponiamo che esista un coprocessore speciale in grado di effettuare il merge di due sequenze di due liste ordinate di m elementi utilizzando O( m) passi, e sia specialmerge() la funziona da chiamare per utilizzare tale coprocessore. Descrivere un algoritmo di ordinamento basato su tale funzione ed analizzare il suo tempo di esecuzione. Soluzione: Sezione Massima somma di sottovettori Progettare un algoritmo che, preso un vettore A di n interi (positivi o negativi), trovi un sottovettore (una sequenza di elementi consecutivi del vettore) la somma dei cui elementi sia massima. Suggerimento L algoritmo banale, di forza bruta, che analizza tutti i possibili casi ha complessità O(n 3 ). È possibile scendere a O(n 2 ) notando che ri-utilizzando calcoli parziali, è possibile evitare di ricalcolare da capo la somma di un sotto-vettore. È possibile fare ancora meglio, O(n log n), con una strategia divide-et-impera. È infine possibile progettare un algoritmo che risolve il problema in tempo O(n). Soluzione: Sezione Valore maggioritario Scrivere un funzione boolean che dato un vettore A di dimensione n, ritorni true se e solo se esiste un valore maggioritario (ovvero che compare almeno n/2 +1 volte). Calcolarne la complessità. Suggerimento: è possibile utilizzare algoritmi divide-et-impera noti per ottenere algoritmi che abbiano complessità O(n log n) o addirittura O(n). Soluzione: Sezione Poligoni Rappresentiamo un poligono convesso come un vettore V [1... n] tale che: ciascun elemento del vettore rappresenta un vertice del poligono tramite un coppia di coordinate (V [i].x, V [i].y); V[1] è il vertice con coordinata x minima;
3 1 PROBLEMI 3 i vertici appaiono in ordine antiorario. Per semplicità, si può assumere che le coordinate x e y di tutti i vertici siano distinte. Progettare un algoritmo che trovi il punto con coordinata y massima. Discutere correttezza e complessità dell algoritmo proposto. Suggerimento: un algoritmo O(n) è banale, un algoritmo O(log n) è più interessante. Soluzione: Sezione Algorithms-R-us L azienda Algorithms-R-us è quotata in borsa. Supponete di avere tabulato nel vettore A[1... n] la quotazione in borsa dell azienda lungo un periodo di tempo lungo n giorni, e che A[1] < A[n]. E possibile dimostrare che esiste almeno una coppia di giorni consecutivi i, i + 1 tale per cui A[i] < A[i + 1]. Scrivere un algoritmo O(log n) che restuisca un indice i in cui questo avviene. Soluzione: Sezione Samarcanda Nel gioco di Samarcanda 1, ogni giocatore è figlio di una nobile famiglia della Serenissima, il cui compito è di partire da Venezia con una certa dotazione di denari, arrivare nelle ricche città orientali, acquistare le merci preziose al prezzo più conveniente e tornare alla propria città per rivenderle. Dato un vettore P di n interi in cui P [i] è il prezzo di una certa merce al giorno i, trovare la coppia di giornate (x, y) con x < y per cui risulta massimo il valore P [y] P [x]. Calcolare la complessità e dimostrare la correttezza. È possibile risolvere il problema in O(n). Soluzione: Sezione
4 2 SOLUZIONI 4 2 Soluzioni 2.1 Analisi Quicksort (Esercizio 12.4 del libro) Nel caso tutti gli elementi del vettore abbiano lo stesso valore, qualunque scelta del perno porta ad una divisione squilibrata del vettore, con n 1 elementi da un lato e 0 dall altro. Ricadiamo quindi nel caso pessimo, che come abbiamo visto ha complessità O(n 2 ). 2.2 Merge Sort iterativo (Esercizio 12.5 del libro) Una versione iterativa di Merge Sort si basa sulla seguente osservazione: è possibile invocare la funzione Merge() sulla prima coppia di elementi del vettore, sulla seconda coppia, sulla terza coppia e così via. A questo punto, il vettore è composto da una serie di coppie ordinate (con eventualmente un elemento singolo in fondo). È possibile invocare la funzione Merge() sulla prima quartina di elementi del vettore, sulla seconda, e così via. Poi su gruppi di 8, poi su gruppi di 16 e così via fino a quando il vettore non è completamente ordinato. Il codice per risolvere il problema è il seguente. MergeSort(integer[ ] A, integer n) integer s 1 while s < n do integer p 1 while p + s n do Merge(A, p, p + s, min(p + 2 s 1, n)) p p + 2 s s s 2 La variabile s rappresenta il numero di elementi che si considerano già ordinati; due gruppi di s elementi vanno ordinati tramite Merge(). s viene raddoppiato ad ogni iterazione del ciclo while più esterno, fino a quando non raggiunge o supera n; a quel punto il vettore è gia ordinato. La variabile p indica il punto iniziale dove trovare due gruppi consecutivi di s elementi, in cui ogni gruppo è già ordinato. Se p + s > n, non ci sono due gruppi, ma uno solo, quindi non ha senso chiamare Merge() e il ciclo while più interno può terminare. 2.3 Prodotto di numeri complessi (Esercizio 12.8 del libro) Vogliamo moltiplicare due numeri a + bi e c + di. Il risultato è ac + adi + bci bd = ac bd + (ad + bc)i, ottenibile con quattro moltiplicazioni e due somme/sottrazioni. La seguente soluzione è dovuta a Gauss (famoso fra l altro per i suoi lavori sui numeri complessi). Dato l input a, b, c, d, calcoliamo la parte reale p r = ac bd e la parte immaginaria p i = ad + bc nel modo seguente: m 1 = ac m 2 = bd p r = m 1 m 2 = ac bd m 3 = (a + b)(c + d) = ac + ad + bc + bd p i = m 3 m 1 m 2 = ad + bc che si può calcolare con tre moltiplicazioni e cinque somme/sottrazioni.
5 2 SOLUZIONI Chi manca? (Esercizio del libro) Poiché manca un unico valore k, tutti i valori i, 1 i < k sono memorizzati nella posizione i-esima del vettore; tutti i valori i, k < i n sono memorizzati nella posizione i 1-esima. Troviamo quindi il più alto indice i tale per cui A[i] = i e il valore mancante sarà k = i + 1. L idea è basata sulla ricerca dicotomica; analizzando le posizioni comprese fra i e j (estremi inclusi), calcoliamo m = (i + j)/2. Se A[m] = m, il più alto indice tale per cui A[i] = i è compreso fra m ed j; se A[m] > m, il più alto indice tale per cui A[i] = i è compreso fra i ed m 1. Quando ci si riduce ad un solo elemento (i = j), abbiamo trovato il nostro indice. La chiamata iniziale è missing(a, 1, n); la complessità è chiaramente O(log n). integer missing(integer[ ] A, integer i, integer j) if i = j then if A[i] = i then return i + 1 return i m (i + j)/2 if A[m] = m then return missing(a, m + 1, j) return missing(a, i, m) 2.5 Punto fisso È sufficiente adattare l algoritmo di ricerca binaria. Siano i e j gli estremi del sottovettore sotto analisi, e sia m = (i + j)/2. Si distinguono i seguenti tre casi: Se A[m] = m restituisci true; Se A[m] < m si prosegue a destra, ovvero sugli elementi A[m n]. Infatti, poiché gli elementi sono tutti distinti, A[m 1] A[m] 1 < m 1; proseguendo in questo modo, si può dimostrare facilmente che A[i] < i per ogni i < m. Se A[m] > m si prosegue a sinistra, ovvero sugli elementi A[1... m 1]. Infatti, poiché gli elementi sono tutti distinti, A[m + 1] A[m] + 1 > m + 1. Proseguendo in questo modo, si può dimostrare facilmente che a[i] > i per ogni i > m. La procedura ricorsiva puntofisso() è chiamata inizialmente con puntofisso(a, 1, n). Il costo della procedura è banalmente O(log n). boolean puntofisso(integer[ ] A, integer i, integer j) if j > i then return false integer m (i + j)/2 if A[m] = m then return true if A[m] < m then return puntofisso(a, m + 1, j) return puntofisso(a, i, m 1)
6 2 SOLUZIONI Vettori unimodulari (VUM) Ancora una volta, utilizziamo un meccanismo di ricerca binaria per risolvere il problema. Il minimo del vettore è sicuramente A[h], percheè minore di tutti gli elementi che lo seguono e lo precedono. L idea e la seguente: prendiamo l elemento mediano A[m] del sottovettore considerato, e consideriamo l elemento a sinistra A[m 1] e a destra A[m + 1]: Se A[m 1] > A[m] < A[m + 1], allora l elemento mediano è proprio h; abbiamo finito; altrimenti, Se A[m 1] > A[m], l elemento che cerco si trova a destra; riduco l insieme; altrimenti, l elemento che cerco si trova a sinistra. Ci sono anche un paio di casi base: il sottovettore considerato ha 1 o 2 elementi, nel qual caso scelgo il minimo. integer vum(integer[ ] A, integer i, integer j) if i = j then if then return A[i] if j = i + 1 then return min(a[i], A[j]) integer m = (i + j)/2 if A[m 1] > A[m] and A[m + 1] > A[m] then return A[m] if A[m 1] > A[m] then return vum(a, m + 1, j) return vum(a, i, m 1) 2.7 Merge coprocessor L algoritmo è ovviamente identico a Merge Sort. Non lo ripetiamo qui. L analisi è molto semplice. Ad ogni passo ricorsivo, il vettore viene suddiviso in due parti uguali, a cui viene applicato la nostra funzione di Merge Sort, e la chiamata di merge richiede (O( n). La funzione di ricorrenza è quindi: T (n) = 2T (n/2) + O( n) Utilizzando il master theorem, si deve verificare qual è il rapporto fra la funzione n log 2 2 e la funzione n. Poiché n log 2 2 = Ω(n 1/2 ), la soluzione della ricorrenza è T (n) = O(n). 2.8 Massima somma di sottovettori Innanzitutto, il vettore di input deve contenere valori negativi, altrimenti la risposta è data dal vettore completo. Un algoritmo banale e poco efficiente per risolvere questo problema consiste nel considerare tutti gli n(n + 1)/2 sottovettori, calcolare la loro sommatoria e ritornare il valore più alto. Un algoritmo del genere
7 2 SOLUZIONI 7 ha costo O(n 3 ). Si noti che il massimo viene inizializzato a zero; infatti, se tutti i valori sono negativi un sottovettore vuoto ha somma zero ed è preferibile. integer maxsum(integer[ ] A, integer n) integer max 0 for i 1 to n do for j i to n do integer sum sum(a, i, j) max max(sum, max) % Massimo valore trovato % Somma sottovettore return max integer sum(integer[ ] A, integer i, integer j) integer sum 0 for k i to j do sum sum + A[k] return sum Un algoritmo migliore si può ottenere notando che la somma di A[i... j] è uguale alla somma di A[i... j 1] più A[j]. L algoritmo corrispondente ha costo O(n 2 ). integer maxsum(integer[ ] A, integer n) integer max 0 for i 1 to n do integer sum 0 for j i to n do sum sum + A[j] if sum > max then max sum % Massimo valore trovato % Somma sottovettore return max Un approccio basato su divide-et-impera divide il vettore A[i... j] in due parti A[i... m], A[m j], con m = (i + j)/2. Ricorsivamente, viene calcolato: max s, il valore massimo fra tutti i sottovettori contenuti nella parte sinistra A[i... m] max d, il valore massimo fra tutti i sottovettori contenuti nella parte destra A[m j] Inoltre, viene calcolato iterativamente il massimo sottovettore che sta a cavallo fra la parte sinistra e la parte destra, ottenuto calcolando: max s, il valore massimo fra tutti i sottovettori contenuti nella parte sinistra e confinanti con la parte destra (ovvero che terminano in A[m]); max d, il valore massimo fra tutti i sottovettori contenuti nella parte destra e confinanti con la parte sinistra (ovvero che iniziano in A[m + 1]); A questo punto, il valore finale è dato dal massimo fra max d, max s e max d + max s. Come caso base, si considerano vettori costituiti da 0 elementi (il cui valore è 0) o da un elemento (il cui valore è il massimo fra l elemento stesso e 0, in modo da escludere valori negativi).
8 2 SOLUZIONI 8 La chiamata iniziale è maxsumric(a, 1, n); il costo computazionale è O(n log n). integer maxsumric(integer[ ] A, integer i, integer j) integer max s, max d, max s, max d, s, m, k if i > j then return 0 if i = j then return max(0, A[i]) m (i + j)/2 max s maxsumric(a, i, m) max d maxsumric(a, m + 1, j) sum 0 max s max d 0 for k m downto i do sum sum + A[k] if sum > max s then max s sum sum 0 for k m + 1 to j do sum sum + A[k] if sum > max d then max d sum return max(max s, max d, max s + max d ) Si può fare ancora meglio. Sia t i il valore del massimo sottovettore che termina in i. Se conosco t i 1, posso calcolare t i osservando due casi: se A[i] + t i 1 ha un valore positivo, questo è il valore del massimo sottovettore che termina in i; se invece ha valore negativo, il massimo sottovettore che termina in i ha valore 0. Questo viene calcolato passo passo dalla variabile here, che assume il valore max(here + A[i], 0). Poiché il sottovettore di valore massimo deve terminare in qualche posizione, calcolando nella variabile m il valore massimo fra tutti i valori here, si ottiene il valore massimo per l intero vettore. Questo algoritmo ha costo O(n). integer maxsum(integer[ ] A, integer n) integer max 0 % Massimo valore trovato integer here 0 % Massimo valore che termina nella posizione attuale for i 1 to n do here max(here + A[i], 0) max max(here, max) return max
9 2 SOLUZIONI Valore maggioritario Una possibile soluzione O(n log n) è basata sull ordinamento; si ordine prima il vettore che poi viene scandito alla ricerca di ripetizioni. boolean majority(integer[ ]A, integer n) sort(a, n) % Con un algoritmo O(n log n) last A[1]; count 1 for i 2 to n do if A[i] = last then count count + 1 if count > n/2 then return true last A[i] count 1 return false Una possibile soluzione O(n) si basa sulla seguente osservazione: se esiste un elemento maggioritario, questo è anche il valore mediano. Basta quindi calcolare il mediano, utilizzando uno degli algoritmi O(n) visti a lezione, e poi contare quante volte questo valore compare nel vettore. Se compare più di n/2 volte, allora abbiamo trovato il nostro valore. boolean majority(integer[ ]A, integer n) m median(a, n) count 0 for i 1 to n do if A[i] = m then count count + 1 % Con un algoritmo O(n) return (count > n/2) 2.10 Poligoni Il fatto che l algoritmo possa essere eseguito in tempo O(log n) suggerisce di utilizzare una ricerca dicotomica. Dobbiamo però capire come scegliere il prossimo punto di ricerca (andiamo a destra oppure a sinistra?), e capire quando abbiamo trovato il punto che cerchiamo. L idea è questa: dati i punti i e j (inizialmente 1 e n), scegliamo il punto h = (i + j)/2. Consideriamo i punti r = (h + 1) mod n e l = (h 1) mod n. Possono darsi quattro casi: 1. V [h].y > V [l].y, V [h].y > V [r].y: h è il punto più alto fra l e r, e poichè il poligono è convesso, è anche il punto più alto di tutti. Abbiamo finito. 2. V [h].y > V [l].y, V [h].y < V [r].y: la direzione verso l alto è l h r, quindi scegliamo di andare verso r. 3. V [h].y < V [l].y, V [h].y > V [r].y: la direzione verso l alto è l h l, quindi scegliamo di andare verso l. 4. V [h].y < V [l].y, V [h].y < V [r].y è il punto più basso, possiamo andare verso l o verso r indipendentemente. Se rimangono due punti, basta scegliere quello più basso.
10 2 SOLUZIONI Algorithms-R-us La soluzione proposta è basata sulla tecnica divide-et-impera. Generalizzando, vogliamo risolvere il problema di identificare due valori consecutivi crescenti in un vettore A[i... j], con A[i] < A[j]. Il problema originale corrisponde a A[1... n]. A[i... j] può essere ridotto ad uno dei sottoproblemi A[i... m] e A[m... j], dove m = (i + j)/2 è l indice mediano fra i e j, in base alle seguenti osservazioni: Se A[i] < A[m], allora è possibile considerare il solo sottoproblema A[i... m], in cui il primo estremo è minore dell ultimo. Se A[m] A[i] < A[j], allora è possibile considerare il solo sottoproblema A[m... j], in cui il primo estremo è minore dell ultimo. Il caso base avviene quando siamo rimasti con due soli elementi. Si noti che applicare ricorsivamente la funzione ad entrambi i sottovettori è inutile e porta ad una complessità di O(n); si noti che è possibile scrivere facilmente questo algoritmo in maniera iterativa. integer trova(item [ ] A, integer i, integer j) if i + 1 = j then return i integer m (i + j)/2 if A[i] < A[m] then return trova(a, i, m) return trova(a, m, j) Chiamata iniziale: trova(a, 1, n) Samarcanda Si calcoli, per tutti gli indici consecutivi, la differenza (positiva o negativa) e la si registri nel vettore H: H[i] = P [i + 1] P [i]. H può essere calcolato in tempo O(n). Si applichi poi l algoritmo O(n) visto nella Sezione 2.8.
11 3 PROBLEMI APERTI 11 3 Problemi aperti 3.1 Mergesort su lista (Esercizio 12.1 del libro) Si riscriva la procedura MergeSort() nel caso in cui la sequenza da ordinare sia contenuta in una lista realizzata con puntatori, mantenendone la stessa complessità O(n log n). 3.2 Quicksort su lista (Esercizio 12.2 del libro) Si riscriva la procedura QuickSort() nel caso in cui la sequenza da ordinare sia contenuta in una lista realizzata con puntatori, mantenendone la stessa complessità media O(n log n). 3.3 Sottovettori sottili Dato un vettore V di interi (positivi o negativi) chiamiamo spessore del vettore la differenza tra il massimo e il minimo del vettore. Progettare un algoritmo che, preso un vettore V di n interi ed un intero C, trovi un sottovettore (una sequenza di elementi consecutivi del vettore) di lunghezza massima tra quelli di spessore al più C. La complessità dell algoritmo deve essere O(n log n).
Esercizi vari. Alberto Montresor. 19 Agosto, 2014
Esercizi vari Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare alle rispettive soluzioni
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,
Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi
Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti
Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti Alberto Montresor 27 marzo 2012 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente,
Esercizi Capitolo 7 - Hash
Esercizi Capitolo 7 - Hash Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare alle rispettive
Esercizi Capitolo 6 - Alberi binari di ricerca
Esercizi Capitolo 6 - Alberi binari di ricerca Alberto Montresor 9 Agosto, 204 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile
Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base
Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1. Sia T una stringa arbitraria di lunghezza n 1 su un alfabeto Σ. È sempre possibile
Esercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla [email protected] Ultimo aggiornamento: 3 novembre 2010 1 Trova la somma/1 Scrivere un algoritmo che dati in input un array A[1... n] di n interi
PROVETTE D ESAME. Algoritmi e Strutture Dati
PROVETTE D ESAME Algoritmi e Strutture Dati ESERCIZIO 1 Si ottengano limiti superiori e inferiori per la seguente ricorrenza ESERCIZIO 1 ESERCIZIO 2 Dato un albero binario T, il grado di sbilanciamento
Note per la Lezione 6 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 6 Ugo Vaccaro Ancora sulla tecnica Programmazione Dinamica Nella lezione scorsa abbiamo appreso che la tecnica Divide-et-Impera,
Tecniche Algoritmiche: divide et impera
Tecniche Algoritmiche: divide et impera Una breve presentazione F. Damiani - Alg. & Lab. 04/05 Divide et impera (o Divide and conquer) Per regnare occorre tenere divisi i nemici e trarne vantaggio F. Damiani
Algoritmi e Strutture Dati
Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli
Esercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla [email protected] Ultimo aggiornamento: 10 novembre 2010 1 La bandiera nazionale (problema 4.7 del libro di testo). Il problema della bandiera
Algoritmi di ordinamento: Array e ricorsione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Indice Algoritmi di ordinamento: Insertion
Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione
Algoritmi greedy Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione Gli algoritmi greedy sono algoritmi basati sull idea
Problemi, istanze, soluzioni
lgoritmi e Strutture di Dati II 2 Problemi, istanze, soluzioni Un problema specifica una relazione matematica tra dati di ingresso e dati di uscita. Una istanza di un problema è formata dai dati di un
Divide et impera. Divide et impera. Divide et impera. Divide et impera
Divide et impera Divide et impera La tecnica detta divide et impera è una strategia generale per impostare algoritmi (par. 9.4). Consideriamo un problema P e sia n la dimensione dei dati, la strategia
Algoritmi e Strutture Dati Geometria Computazionale. Daniele Loiacono
Algoritmi e Strutture Dati Geometria Computazionale Riferimenti 2 T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein Introduction to Algorithms, Second Edition Queste trasparenze sono disponibili su http://dei.polimi.it/upload/loiacono
Cammini minimi fra tutte le coppie
Capitolo 12 Cammini minimi fra tutte le coppie Consideriamo il problema dei cammini minimi fra tutte le coppie in un grafo G = (V, E, w) orientato, pesato, dove possono essere presenti archi (ma non cicli)
Algoritmi e Strutture di Dati (3 a Ed.) String matching. Alan Bertossi, Alberto Montresor
Algoritmi e Strutture di Dati (3 a Ed.) String matching Alan Bertossi, Alberto Montresor STRING MATCHING. Date una stringa P di m caratteri (pattern) e una stringa T di n caratteri, con m n, trovare un
Analisi algoritmi ricorsivi e relazioni di ricorrenza
Analisi algoritmi ricorsivi e relazioni di ricorrenza Punto della situazione Finora abbiamo affrontato: il tempo di esecuzione di un algoritmo, l analisi asintotica con le notazioni asintotiche e la tecnica
Rappresentazione degli algoritmi
Rappresentazione degli algoritmi Universitá di Ferrara Ultima Modifica: 21 ottobre 2014 1 1 Diagramma di flusso Utilizzare il diagramma di flusso per rappresentare gli algoritmi che risolvono i seguenti
Note per la Lezione 4 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 4 Ugo Vaccaro Ripasso di nozioni su Alberi Ricordiamo che gli alberi rappresentano una generalizzazione delle liste, nel senso che
Esercizi sulla complessità di frammenti di pseudo-codice
Esercizi sulla complessità di frammenti di pseudo-codice Esercizio 1 Si determini la complessità temporale del seguente frammento di pseudo-codice in funzione di n. Il ciclo contiene solo istruzioni elementari;
Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 12 Array e Oggetti A. Miola Dicembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Array e Oggetti 1 Contenuti Array paralleli
Algoritmi e Strutture di Dati (3 a Ed.) Errata corrige. Alan Bertossi, Alberto Montresor
Algoritmi e Strutture di Dati (3 a Ed.) Errata corrige Alan Bertossi, Alberto Montresor Gli autori saranno riconoscenti a chiunque segnali errori presenti nel libro di testo, scrivendo ad [email protected].
Tempo e spazio di calcolo (continua)
Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza
Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ Heap e Heapsort Algoritmi di ordinamento Insertion Sort Quicksort Heapsort Insertion Sort L
Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013
Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario La ricorsione Metodi ricorsivi Esercizi proposti 16/01/2013 2 La ricorsione In Java ogni metodo può chiamare anche se stesso,
Esercizi Capitolo 6 - Alberi binari di ricerca
Esercizi Capitolo 6 - Alberi binari di ricerca Alberto Montresor 23 settembre 200 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile
Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.
E. Calabrese: Fondamenti di Informatica Algoritmi-1 Algoritmi di ricerca Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. Per esempio: - cercare
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa E03 Esempi di algoritmi e programmi A. Miola Settembre 2006 http://www.dia.uniroma3.it/~java/fondinf1/ Esempi di algoritmi e
Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi
Lezione 4 Problemi trattabili e soluzioni sempre più efficienti Gianluca Rossi Trattabile o intrattabile? Consideriamo ora il problema, ben noto a tutti gli studenti a partire dalla scuola media, di calcolare
Fondamenti di Informatica 6. Algoritmi e pseudocodifica
Vettori e matrici #1 Fondamenti di Informatica 6. Algoritmi e pseudocodifica Corso di Laurea in Ingegneria Civile A.A. 2010-2011 1 Semestre Prof. Giovanni Pascoschi Le variabili definite come coppie
Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.
Esercizio 1 E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1 livello 0 FB = -1 FB = -1 livello 1 FB = -1 livello 2 livello 3 L altezza è 3, il minimo si trova nel
Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:
Pag 29 4) La ricorsione 4.1 Funzioni matematiche ricorsive Partiamo da un concetto ben noto, quello delle funzioni matematiche ricorsive. Una funzione matematica è detta ricorsiva quando la sua definizione
11.4 Chiusura transitiva
6 11.4 Chiusura transitiva Il problema che consideriamo in questa sezione riguarda il calcolo della chiusura transitiva di un grafo. Dato un grafo orientato G = hv,ei, si vuole determinare il grafo orientato)
5. DIVIDE AND CONQUER I
Divide-et-Impera (Divide and conquer) 5. DIVIDE AND CONQUER I Mergesort e Relazioni di ricorrenza Esempi di progettazione D&I Moltiplicazione di interi Contare inversioni Divide-et-Impera. Definizione
Studio degli algoritmi
COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.2006/07 Prof. V.L. Plantamura Dott.ssa A. Angelini Studio degli algoritmi Dato un problema P, le problematiche riguardano: Sintesi
Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento
Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento
Problemi di ordinamento
Problemi di ordinamento Input: una sequenza di n numeri a 1, a 2,..., a n ; Output: una permutazione a 1, a 2,..., a n di a 1, a 2,..., a n tale che a 1 a 2... a n. Generalmente, la sequenza è rappresentata
n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita
Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita n! = 1 n( n 1)! se se n n = > 0 0 dove n è un numero intero non negativo Il calcolo del fattoriale
Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree
Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca Interval Tree un albero binario di ricerca le
Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output
Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output F = { (s, s ) } per ogni s esiste una e una sola coppia (s, s ). Esempio: un algoritmo che calcola il quadrato di
Appunti sui Codici di Reed Muller. Giovanni Barbarino
Appunti sui Codici di Reed Muller Giovanni Barbarino Capitolo 1 Codici di Reed-Muller I codici di Reed-Muller sono codici lineari su F q legati alle valutazioni dei polinomi sullo spazio affine. Per semplicità
Lezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona
Lezione 8 programmazione in Java Nicola Drago [email protected] Dipartimento di Informatica Università di Verona Anteprima Programmazione ricorsiva Fattoriale Somma di n numeri Torre di Hanoi Array
PROGRAMMAZIONE STRUTTURATA
PROGRAMMAZIONE STRUTTURATA Programmazione strutturata 2 La programmazione strutturata nasce come proposta per regolamentare e standardizzare le metodologie di programmazione (Dijkstra, 1965) Obiettivo:
2. Analisi degli Algoritmi
2. Analisi degli Algoritmi Introduzione 2.1 Un modello di macchina elementare: la Macchina a Registri 2.2 Costo di esecuzione di un programma 2.3 Analisi del costo di esecuzione: il modello a costi uniformi
Esercitazione 10 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016
Esercitazione 10 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016 Tong Liu May 10, 2016 Elementi fondamentali Un algoritmo non deterministico è un algoritmo che posto di fronte alla necessità di
Programmazione dinamica
Programmazione dinamica Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati Programmazione
RISOLUZIONE DI SISTEMI LINEARI
RISOLUZIONE DI SISTEMI LINEARI Algebra lineare numerica 1 La risoluzione di un sistema lineare è il nucleo principale del processo di risoluzione di circa il 70% di tutti i problemi reali Per la risoluzione
Algoritmi di ordinamento
Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min
A lezione sono stati presentati i seguenti passi per risolvere un problema:
Calcolo delle radici di un polinomio Problema: Dati i coefficienti a,b,c di un polinomio di 2 grado della forma: ax^2 + bx + c = 0, calcolare le radici. A lezione sono stati presentati i seguenti passi
Algoritmi e Strutture Dati
Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Il concetto di dato Il concetto di tipo di dato Insertion Sort for j 2 to lenght[a]
Algoritmi e Strutture Dati. Capitolo 4 Ordinamento
Algoritmi e Strutture Dati Capitolo 4 Ordinamento Ordinamento Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S Esempi: ordinare una lista di nomi alfabeticamente, o un
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.
Alberi Alberi Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Frodo Dudo Daisy Alberi Gli alberi sono una generalizzazione
Strutture dati per insiemi disgiunti
Strutture dati per insiemi disgiunti Servono a mantenere una collezione S = {S 1, S 2,..., S k } di insiemi disgiunti. Ogni insieme S i è individuato da un rappresentante che è un particolare elemento
Laboratorio di Python
Problem solving, Ricorsione, Università di Bologna 13 e 15 marzo 2013 Sommario 1 2 3 4 Errore di semantica Esercizio def vocali(s): voc='' for c in s: if c in 'aeiou': voc=voc+c return voc Cerchiamo di
Alberi e alberi binari I Un albero è un caso particolare di grafo
Alberi e alberi binari Un albero è un caso particolare di grafo È costituito da un insieme di nodi collegati tra di loro mediante archi Gli archi sono orientati (ogni arco esce da un nodo origine ed entra
public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;
Metodi iterativi con array monodimensionali 1. Scrivere un metodo che, dato un array di interi a, restituisce il valore minimo in a. public static int minimo (int[] a) { int min = a[0]; for (int i=1; i
Riassumiamo le proprietà dei numeri reali da noi utilizzate nel corso di Geometria.
Capitolo 2 Campi 2.1 Introduzione Studiamo ora i campi. Essi sono una generalizzazione dell insieme R dei numeri reali con le operazioni di addizione e di moltiplicazione. Nel secondo paragrafo ricordiamo
Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I)
Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I) Algoritmi greedy Gli algoritmi per problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento
Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento Alessandra Raffaetà Università Ca Foscari Venezia Corso di Laurea in Informatica Ricerca binaria Assunzione:
Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software
Introduzione alla programmazione Algoritmi e diagrammi di flusso F. Corno, A. Lioy, M. Rebaudengo Sviluppo del software problema idea (soluzione) algoritmo (soluzione formale) programma (traduzione dell
Esercizi per il corso di Algoritmi e Strutture Dati
1 Esercizi per il corso di Algoritmi e Strutture Dati Esercizi sulla Tecnica Divide et Impera N.B. Tutti gli algoritmi vanno scritti in pseudocodice (non in Java, né in C++, etc. ). Di tutti gli algoritmi
Un esempio di calcolo di complessità: insertion sort
Un esempio di calcolo di complessità: insertion sort Vediamo su un esempio come si può calcolare la complessità di un algoritmo... L esempio è un metodo semplice per ordinare arrays: insertion sort, o
In molte applicazioni sorge il problema di sapere in quanti modi possibili si può presentare un certo fenomeno.
Definizione Oggetto del calcolo combinatorio è quello di determinare il numero dei modi mediante i quali possono essere associati, secondo prefissate regole, gli elementi di uno stesso insieme o di più
Esercizi su alberi binari
Esercizi su alberi binari Esercizi svolti: Determinazione nodi contenti verifica completezza verifica quasi completezza lunghezza del cammino interno determinazione ultima foglia in un quasi completo verifica
Algoritmi e Strutture Dati
Heap Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 Heap Heap binari: definizione Un heap binario è una struttura dati composta
Fondamenti di Informatica T-1 Modulo 2
Fondamenti di Informatica T-1 Modulo 2 1 Obiettivi di questa esercitazione 1. Array e funzioni 2. Array e funzioni ricorsive 3. Array e confronto di array 2 Esercizio 1 Creare un programma che legga da
