06: Programmazione Dinamica
30 Questions
0 Views

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson

Questions and Answers

Qual è uno degli obiettivi della programmazione dinamica?

  • Eliminare completamente i sottoproblemi
  • Migliorare la comprensione della complessità degli algoritmi ricorsivi (correct)
  • Evitare totalmente la ricorsione
  • Aumentare la difficoltà degli algoritmi
  • La programmazione dinamica può considerare sottoproblemi che non sono indipendenti tra loro.

    True (A)

    Quali sono le due principali proprietà necessarie per applicare la programmazione dinamica?

    sottostruttura della soluzione e sottoproblemi ripetuti

    In programmazione dinamica, la __________ è l'approccio che consiste nel memorizzare i risultati già calcolati per evitare di ripetere i calcoli.

    <p>memoization</p> Signup and view all the answers

    Abbina i seguenti termini e le loro descrizioni:

    <p>Fibonacci = Un esempio classico di problema risolvibile con la programmazione dinamica PD = Programmazione dinamica DI = Divide-et-impera LCS = Longest Common Subsequence</p> Signup and view all the answers

    Qual è la differenza chiave tra programmazione dinamica e Divide-et-Impera?

    <p>PD può gestire sottoproblemi dipendenti, DI no (C)</p> Signup and view all the answers

    Per applicare la programmazione dinamica, è necessario che i sottoproblemi siano unici e non ripetuti.

    <p>False (B)</p> Signup and view all the answers

    Qual è la fase iniziale dello sviluppo in programmazione dinamica?

    <p>caratterizzazione della struttura di una soluzione</p> Signup and view all the answers

    Che cosa rappresenta il simbolo LCS in questo contesto?

    <p>Longest Common Subsequence (A)</p> Signup and view all the answers

    Se le sequenze X e Y hanno il primo elemento uguale, l'ultimo elemento di Z deve essere uguale a X.

    <p>False (B)</p> Signup and view all the answers

    Cosa indica il lemma 1 riguardo a Z, se X e Y hanno lo stesso ultimo elemento?

    <p>Z è LCS(X, Y) e z = x.</p> Signup and view all the answers

    Se X = x, ... , x e Y = y, ... , y con x = y, allora __________ è LCS(X, Y).

    <p>Z</p> Signup and view all the answers

    Abbina le seguenti proprietà alla loro descrizione corretta:

    <p>x = y = Z è LCS(X, Y) e z = x x ≠ y = L'ultimo elemento di Z può essere x o y Z è LCS(X, Y) = Indica che Z è una sottosequenza comune Z non è LCS(X, Y) = Esiste un'altra LCS Z' che include più elementi</p> Signup and view all the answers

    Quale delle seguenti affermazioni è vera riguardo la relazione tra Z, X e Y?

    <p>Z è LCS(X, Y) oppure Z è LCS(X, Y). (A)</p> Signup and view all the answers

    Se Z è LCS(X, Y), allora Z può contenere solo elementi di X.

    <p>False (B)</p> Signup and view all the answers

    Qual è il risultato se x è diverso da y nelle sequenze X e Y?

    <p>Z è LCS(X, Y) oppure Z è LCS(X, Y).</p> Signup and view all the answers

    La __________ indica che Z è una sottosequenza comune massima tra due sequenze.

    <p>LCS</p> Signup and view all the answers

    Qual è la formula per calcolare il numero di coppie di conigli nella successione di Fibonacci?

    <p>$f_n = f_{n-1} + f_{n-2}$ (A)</p> Signup and view all the answers

    Nella successione di Fibonacci, ogni coppia di conigli genera una coppia per ogni generazione successiva e poi muore.

    <p>True (A)</p> Signup and view all the answers

    Qual è la complessità asintotica della soluzione ricorsiva per calcolare la successione di Fibonacci?

    <p>esponenziale</p> Signup and view all the answers

    Nella memoization, il numero di nodi soddisfa una ricorsione simile a quella della successione di __________.

    <p>Fibonacci</p> Signup and view all the answers

    Qual è la crescita della complessità per l'algoritmo di Fibonacci ricorsivo?

    <p>Esponenziale (C)</p> Signup and view all the answers

    Il tempo di calcolo usando Fib-Memoization è $ heta(n)$.

    <p>True (A)</p> Signup and view all the answers

    Che cosa rappresenta la formula di Binet?

    <p>Crea una formula chiusa per calcolare i numeri di Fibonacci.</p> Signup and view all the answers

    La massima sottosequenza comune (LCS) è definita come Z che ha lunghezza __________.

    <p>massima</p> Signup and view all the answers

    Abbina ciascun metodo di calcolo della successione di Fibonacci con la sua complessità spazio-temporale:

    <p>Fib-Memoization = Θ(n) spazio e tempo Fib-BottomUp = Θ(n) tempo e spazio Fib-Iter = Θ(1) spazio e Θ(n) tempo Fib-Recursivo = Crescita esponenziale</p> Signup and view all the answers

    In che modo Fibonacci-Iter differisce da Fibonacci-Memoization in termini di spazio utilizzato?

    <p>Utilizza meno spazio (C)</p> Signup and view all the answers

    Due sequenze diverse possono avere la stessa massima sottosequenza comune.

    <p>True (A)</p> Signup and view all the answers

    Cosa significa che Z è una sottosequenza di X?

    <p>Z prende elementi non necessariamente consecutivi da X.</p> Signup and view all the answers

    Il numero di nodi nei livelli dell'albero delle chiamate soddisfa la relazione N = N(n-1) + N(n-2) + __________.

    <p>1</p> Signup and view all the answers

    Flashcards

    Programmazione Dinamica (PD)

    Un approccio alla soluzione dei problemi che scompone il problema in sottoproblemi e utilizza le soluzioni dei sottoproblemi per costruire la soluzione completa.

    Divide-et-Impera (DI)

    Un metodo per risolvere problemi scomponendoli in sottoproblemi indipendenti. Ogni sottoproblema viene risolto una volta e la soluzione finale è ottenuta combinando le soluzioni dei sottoproblemi.

    Sottostruttura della soluzione (ottima)

    Una delle principali proprietà che rendono un problema adatto alla programmazione dinamica. Indica che la soluzione ottimale del problema può essere costruita a partire dalle soluzioni ottimali dei suoi sottoproblemi.

    Sottoproblemi ripetuti

    Seconda proprietà importante per la programmazione dinamica. Indica che lo stesso sottoproblema viene incontrato più volte durante il processo di risoluzione.

    Signup and view all the flashcards

    Memoization

    Un passo nella risoluzione di un problema con la programmazione dinamica che consiste nel memorizzare le soluzioni dei sottoproblemi per evitare di calcolarle ogni volta.

    Signup and view all the flashcards

    Bottom-up

    Un algoritmo che risolve un problema lavorando dal basso verso l'alto. Inizia con i sottoproblemi più piccoli e gradualmente costruisce la soluzione finale.

    Signup and view all the flashcards

    Problema LCS (Longest Common Subsequence)

    Un problema che consiste nel trovare la sottosequenza più lunga comune a due sequenze di caratteri date.

    Signup and view all the flashcards

    Programmazione Dinamica

    Una tecnica che cerca di risolvere un problema riutilizzando le soluzioni dei sottoproblemi. Si basa sulla proprietà di sottostruttura e la presenza di sottoproblemi ripetuti.

    Signup and view all the flashcards

    Approccio Bottom-Up

    Un approccio bottom-up per la risoluzione di un problema prevede la costruzione della soluzione passo dopo passo, partendo da soluzioni più piccole fino a raggiungere la soluzione completa.

    Signup and view all the flashcards

    Successione di Fibonacci

    La successione di Fibonacci è una sequenza di numeri in cui ogni numero è la somma dei due numeri precedenti. Inizia con 0 e 1, quindi i numeri successivi sono 1, 2, 3, 5, 8, 13, e così via.

    Signup and view all the flashcards

    Algoritmo Ricorsivo

    Un algoritmo ricorsivo è un algoritmo che si chiama da solo per risolvere parti più piccole dello stesso problema.

    Signup and view all the flashcards

    Complessità Asintotica

    La complessità asintotica di un algoritmo descrive come il tempo di esecuzione dell'algoritmo cresce al crescere della dimensione dell'input. Ad esempio, un algoritmo con complessità lineare cresce linearmente in tempo al crescere dell'input.

    Signup and view all the flashcards

    Albero di Chiamate

    Un albero di chiamate è una rappresentazione visiva delle chiamate ricorsive in un algoritmo. Ogni nodo nell'albero rappresenta una chiamata alla funzione ricorsiva.

    Signup and view all the flashcards

    Memoizzazione

    La memoizzazione è una tecnica di ottimizzazione che memorizza i risultati intermedi di un calcolo per evitarne il ricalcolo.

    Signup and view all the flashcards

    Fib-Memoization

    Fib-Memoization è una versione dell'algoritmo di Fibonacci che utilizza la memoizzazione per migliorare la sua efficienza. Memorizza i risultati intermedi del calcolo per evitare il ricalcolo.

    Signup and view all the flashcards

    Fib-BottomUp

    Fib-BottomUp è una versione bottom-up dell'algoritmo di Fibonacci che costruisce la soluzione passo dopo passo, partendo dai primi termini della sequenza.

    Signup and view all the flashcards

    Fib-Iter

    Fib-Iter è una versione iterativa dell'algoritmo di Fibonacci che utilizza un ciclo per calcolare la sequenza.

    Signup and view all the flashcards

    Massima Sottosequenza Comune (LCS)

    La massima sottosequenza comune (LCS) è la sequenza più lunga che è sottosequenza di due o più sequenze.

    Signup and view all the flashcards

    Confronto DNA con LCS

    Due sequenze di DNA possono essere confrontate per trovare la massima sottosequenza comune di basi che hanno in comune.

    Signup and view all the flashcards

    Sottosequenza

    Una sottosequenza è una sequenza che può essere ottenuta da un'altra sequenza eliminando alcuni elementi (non necessariamente consecutivi).

    Signup and view all the flashcards

    Massima Sottosequenza Comune

    Una massima sottosequenza comune è la sottosequenza più lunga che è comune a due o più sequenze.

    Signup and view all the flashcards

    Prefisso

    Un prefisso di una sequenza è una sottosequenza che contiene tutti gli elementi dalla prima posizione fino a una posizione data nella sequenza originale.

    Signup and view all the flashcards

    LCS di prefissi

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e l'ultimo elemento di 𝑍 è 𝑥, allora 𝑍 è anche la LCS del prefisso di 𝑋 che termina con 𝑥 e di 𝑌.

    Signup and view all the flashcards

    LCS di prefissi (caso generale)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e l'ultimo elemento di 𝑍 è 𝑥, allora 𝑍 è anche la LCS dei prefissi di 𝑋 e 𝑌 che terminano rispettivamente con 𝑥 e con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso particolare (𝑥 = ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e l'ultimo elemento di 𝑍 è 𝑥, e 𝑥 è uguale all'ultimo elemento di 𝑌, allora 𝑍 è anche la LCS dei prefissi di 𝑋 e 𝑌 che terminano rispettivamente con 𝑥 e con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso generale (𝑥 ≠ ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è diverso dall'ultimo elemento di 𝑌, allora 𝑍 è la LCS del prefisso di 𝑋 che termina con 𝑥 o del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso speciale (𝑥 = ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è uguale all'ultimo elemento di 𝑌, allora 𝑍 è anche la LCS del prefisso di 𝑋 che termina con 𝑥 e del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso generale (𝑥 ≠ ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è diverso dall'ultimo elemento di 𝑌, allora 𝑍 è la LCS del prefisso di 𝑋 che termina con 𝑥 o del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso speciale (𝑥 = ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è uguale all'ultimo elemento di 𝑌, allora 𝑍 è anche la LCS del prefisso di 𝑋 che termina con 𝑥 e del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso generale (𝑥 ≠ ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è diverso dall'ultimo elemento di 𝑌, allora 𝑍 è la LCS del prefisso di 𝑋 che termina con 𝑥 o del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Caso speciale (𝑥 = ultimo elemento di 𝑌)

    Se 𝑍 è la LCS di 𝑋 e 𝑌, e 𝑥 è uguale all'ultimo elemento di 𝑌, allora 𝑍 è anche la LCS del prefisso di 𝑋 che termina con 𝑥 e del prefisso di 𝑌 che termina con l'ultimo elemento di 𝑌.

    Signup and view all the flashcards

    Study Notes

    • Obiettivi: Migliorare la comprensione della complessità degli algoritmi ricorsivi e del modo in cui riutilizzare le soluzioni di sottoproblemi per risolvere un problema dato.

    • Argomenti:

      • Algoritmo di Fibonacci con ricorsione, memoization e approccio bottom-up.
      • Problema LCS (Longest Common Subsequence).

    Programmazione Dinamica vs. Divide et Impera

    • Entrambi gli approcci si basano sulla scomposizione ricorsiva di un problema in sottoproblemi.
    • Divide et Impera è efficiente quando i sottoproblemi sono indipendenti.
    • Programmazione Dinamica è spesso più efficiente quando i sottoproblemi si ripetono, riducendo la complessità computazionale (spesso da esponenziale a polinomiale).

    Condizioni di Applicabilità della Programmazione Dinamica

    • Sottostruttura ottima: La soluzione ottimale del problema deve poter essere ottenuta combinando soluzioni ottimali di sottoproblemi.
    • Sottoproblemi ripetuti: Gli stessi sottoproblemi devono essere calcolati più volte durante l'esecuzione dell'algoritmo.

    Fasi di Sviluppo di un Algoritmo di Programmazione Dinamica

    • Caratterizzazione della struttura della soluzione: Definire la struttura della soluzione ottimale, specificando le relazioni tra le soluzioni dei sottoproblemi.
    • Definizione ricorsiva della soluzione: Definire il problema in termini ricorsivi, esplicitando le dipendenze dai sottoproblemi.
    • Eliminazione delle ripetizioni (memoization): Memorizzare i risultati dei sottoproblemi già calcolati per evitare di ricalcolarli più volte.
    • Sviluppo di un approccio bottom-up (iterativo): Risolvere i sottoproblemi più piccoli prima, e costruire la soluzione del problema principale combinando i risultati dei sottoproblemi.

    Successione di Fibonacci

    • Rappresenta una sequenza di numeri, dove ogni numero è la somma dei due precedenti, partendo da 0 e 1.
    • Può essere calcolata sia con un approccio ricorsivo che iterativo.
    • L'approccio ricorsivo ha una complessità molto alta (esponenziale), a causa dei calcoli ripetuti.

    Algoritmo Ricorsivo per la Successione di Fibonacci

    • Il calcolo dei numeri di Fibonacci ha una complessità esponenziale a causa dei calcoli ripetuti degli stessi sottoproblemi.
    • Il metodo ricorsivo è inefficiente perché ricalcola frequentemente gli stessi risultati.

    Albero delle Chiamate

    • L'albero rappresenta le chiamate ricorsive durante l'esecuzione di un algoritmo di Fibonacci ricorsivo.
    • I nodi dell'albero rappresentano le chiamate alle funzioni recursive.
    • Mostra una notevole ridondanza di calcoli, poiché i nodi corrispondenti a sottoproblemi uguali vengono ricalcolati più volte.

    Fibonacci con Memoization

    • Memorizza i risultati dei calcoli di sottoproblemi già eseguiti per evitare ripetizioni.
    • L'uso della memoization riduce drasticamente la complessità computazionale del calcolo di Fibonacci (da esponenziale a lineare).
    • È un compromesso tra l'approccio puramente ricorsivo e l'approccio bottom-up.

    Fibonacci con Approccio Bottom-up (Iterativo)

    • Il metodo iterativo costruisce i valori dei numeri di Fibonacci in ordine consecutivo, partendo dai valori iniziali (0 e 1).
    • L'approccio bottom-up elimina le ridondanze, sfruttando i calcoli già eseguiti.
    • Ha una complessità lineare (O(n)).

    Massima Sottosequenza Comune (LCS) - Definizioni

    • Data due sequenze S1 e S2, trovare la sottosequenza più lunga comune a entrambe.
    • Le sottosequenze possono contenere elementi non consecutivi delle sequenze originali.
    • Un esempio pratico è l'analisi dell'identità delle sequenze biologiche.

    Proprietà della Sottostruttura per LCS

    • La soluzione ottimale per LCS(X, Y) è costruita combinando le soluzioni ottimali dei sottoproblemi.
    • Se l'ultimo elemento delle due sequenze sono gli stessi, la sottosequenza comune più lunga è l'elemento in comune concatenato con l'LCS delle sequenze rimanenti.
    • Se gli elementi sono diversi, la sottosequenza più lunga è determinata dal massimo tra l'LCS della prima sequenza e della seconda, senza l'ultimo elemento della seconda sequenza e viceversa.

    Algoritmo Bottom-up per LCS

    • Calcola l'LCS di due sequenze in modo iterativo tramite una tabella di memoization (c), dove l'indice c[i][j] rappresenta la lunghezza dell'LCS dei primi i elementi di X e j elementi di Y.
    • Ha una complessità computazionale di O(m*n), con m ed n la lunghezza delle due sequenze.

    Studying That Suits You

    Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

    Quiz Team

    Related Documents

    Programmazione Dinamica PDF

    Description

    Questo quiz esplora i concetti fondamentali della programmazione dinamica, inclusi l'algoritmo di Fibonacci e il problema della Longest Common Subsequence. Scoprirai anche le differenze tra programmazione dinamica e l'approccio Divide et Impera. Testa la tua comprensione delle condizioni di applicabilità di questi metodi.

    More Like This

    Dynamic Programming
    20 questions

    Dynamic Programming

    ChivalrousSmokyQuartz avatar
    ChivalrousSmokyQuartz
    Dynamic Programming Quiz
    3 questions
    Use Quizgecko on...
    Browser
    Browser