Tesi Robotica Un coprocessore per Stereo-Matching: Profiling ... | Page 44

i i “MF_Tesi” — 2011/9/12 — 11:39 — page 44 — #44 i 3.3. VARIANTE: MEMOIZATION 3.2.2 i 44 Sovrapposizione dei problemi Il secondo requisito che un problema di ottimizzazione deve possedere affinché sia utilizzabile la programmazione dinamica è che lo spazio dei sotto-problemi deve essere “piccolo” nel senso che un algoritmo ricorsivo per la risoluzione del problema risolve lo stesso sotto-problema più volte, anziché generare ogni volta nuovi sotto-problemi. Tipicamente, il numero complessivo di sotto-problemi distinti è polinomiale rispetto alla taglia dell’input. Quando un algoritmo ricorsivo rivisita lo stesso problema diverse volte, diciamo che il problema di ottimizzazione presenta una sovrapposizione di sotto-problemi. Invece, in un problema per il quale è conveniente usare l’approccio divide-et-impera vengono generati dei nuovi sotto-problemi ad ogni passo della ricorsione. Gli algoritmi di programmazione dinamica tipicamente sfruttano la sovrapposizione dei sottoproblemi risolvendo ogni sotto-problema solo una volta e poi memorizzando la soluzione in una tabella dalla quale può essere successivamente ripreso quando necessario, utilizzando un tempo costante per l’accesso in memoria. 3.3 Variante: Memoization Esiste una variante che offre gli stessi vantaggi della programmazione dinamica mantenendo, però, una struttura top-down. L’idea di base è quella di memorizzare l’inefficiente algoritmo ricorsivo. Così come in un classico algoritmo di programmazione dinamica, manteniamo una tabella contenente le soluzioni di sotto-problemi, dove però la struttura di controllo per il riempimento della tabella è molto più simile a quello dell’algoritmo ricorsivo. Un algoritmo ricorsivo memorizzato mantiene una entry in una tabella per la soluzione ad ogni sotto problema. Ogni entry inizialmente contiene un valore speciale che indica che non è stata ancora inserita l’entry. Quando il sottoproblema è incontrato per la prima volta durante l’esecuzione dell’algoritmo ricorsivo, la sua soluzione viene computata e memorizzata nella tabella. Ogni volta che il sotto-problema viene nuovamente incontrato, viene semplicemente restituito il valore contenuto nella tabella, anziché ricomputare la risposta al sotto-problema. In generale, se tutti i sotto-problemi devono essere risolti almeno una volta, un algoritmo di programmazione dinamica bottom-up di solito è più efficiente di un algoritmo ricorsivo top-down memorizzato, dato che bisogna aggiungere i i i i