Δείτε πώς λειτουργεί:
1. Αναδρομική δομή: Τα δυναμικά προβλήματα προγραμματισμού συχνά προσφέρονται σε επαναλαμβανόμενες λύσεις. Μια αφελής αναδρομική εφαρμογή θα υπολογίζει επανειλημμένα τις λύσεις στα ίδια υποπρογράμματα, οδηγώντας σε εκθετική πολυπλοκότητα του χρόνου.
2. Αποθήκευση αποτελεσμάτων: Η ενίσχυση εισάγει μια δομή δεδομένων (συνήθως έναν πίνακα κατακερματισμού ή πίνακα) για την αποθήκευση των λύσεων στα υποπροβήματα που έχουν ήδη υπολογιστεί. Αυτή η δομή ονομάζεται συχνά "σημείωμα" ή "cache".
3. Έλεγχος του σημείωμα: Πριν από την επίλυση ενός υποπροσθένεια, ο αλγόριθμος ελέγχει πρώτα το σημείωμα. Εάν η λύση είναι ήδη παρούσα (δηλαδή το υποπρόμπτο έχει λυθεί πριν), έχει ανακτηθεί απευθείας από το σημείωμα, αποφεύγοντας την ανασυγκρότηση.
4. Αποθήκευση του αποτελέσματος: Εάν η λύση δεν βρίσκεται στο σημείωμα, ο αλγόριθμος αναδρομικά επιλύει το υποπροσωπικό και στη συνέχεια αποθηκεύει * το αποτέλεσμα στο σημείωμα πριν την επιστρέψει.
Παράδειγμα:
Εξετάστε τον υπολογισμό της ακολουθίας Fibonacci. Μια αφελής αναδρομική προσέγγιση έχει εκθετική πολυπλοκότητα επειδή υπολογίζει εκ νέου πολλούς αριθμούς Fibonacci πολλές φορές. Με υπόμνημα:
`` `Python
memo ={} # αρχικοποιήστε το σημείωμα
def fibonacci_memo (n):
Εάν n σε σημείωμα:
επιστροφή σημείωμα [n] # ανάκτηση από το σημείωμα εάν ήδη υπολογιστεί
Εάν n <=1:
επιστροφή n
αλλού:
αποτέλεσμα =fibonacci_memo (n-1) + fibonacci_memo (n-2)
Σημείωμα [n] =Αποθήκευση # Αποθηκεύστε το αποτέλεσμα στο σημείωμα
αποτέλεσμα επιστροφής
εκτύπωση (fibonacci_memo (5)) # έξοδος:5
`` `
Σε αυτό το παράδειγμα, το "Memo` αποθηκεύει τους υπολογισμένους αριθμούς Fibonacci. Όταν ονομάζεται `fibonacci_memo (5)`, καλεί αναδρομικά `fibonacci_memo (4)` και `fibonacci_memo (3)`. `fibonacci_memo (3)` θα καλέσει αναδρομικά `fibonacci_memo (2)` και `fibonacci_memo (1)`. Ωστόσο, όταν το `fibonacci_memo (1) ή το` fibonacci_memo (2) `υπολογίζεται και αποθηκεύεται σε` memo`, οι επόμενες κλήσεις σε αυτά τα ίδια υπο -προβλήματα θα επιστρέψουν απευθείας τα αποθηκευμένα αποτελέσματα, αποφεύγοντας τον περιττό υπολογισμό. Αυτό μειώνει την πολυπλοκότητα του χρόνου από εκθετική σε γραμμική.
Στην ουσία, η υπόμνημα μετατρέπει έναν πιθανώς αναδρομικό αλγόριθμο εκθετικού χρόνου σε έναν αλγόριθμο γραμμικού χρόνου (ή πολυώνυμου χρόνου σε άλλες περιπτώσεις) αξιοποιώντας τη δύναμη της προσωρινής αποθήκευσης που είχαν προηγουμένως υπολογισμένα αποτελέσματα. Είναι μια ισχυρή τεχνική βελτιστοποίησης που χρησιμοποιείται συχνά σε συνδυασμό με τον δυναμικό προγραμματισμό για τη βελτίωση της αποτελεσματικότητας.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα