Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Προγραμματισμός C / C++

Πώς ενισχύει η απομάκρυνση της αποτελεσματικότητας των αλγορίθμων δυναμικού προγραμματισμού;

Η ενίσχυση ενισχύει δραματικά την αποτελεσματικότητα των αλγορίθμων δυναμικού προγραμματισμού αποφεύγοντας περιττούς υπολογισμούς. Ο δυναμικός προγραμματισμός επιλύει τα προβλήματα με το σπάσιμο τους σε μικρότερα αλληλεπικαλυπτόμενα υποπροβλήματα, επιλύοντας κάθε υποπρογραμμάτισμα μόνο μία φορά και αποθηκεύοντας τις λύσεις τους. Η ενίσχυση είναι μια προσέγγιση από πάνω προς τα κάτω για να επιτευχθεί αυτό.

Δείτε πώς λειτουργεί:

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`, οι επόμενες κλήσεις σε αυτά τα ίδια υπο -προβλήματα θα επιστρέψουν απευθείας τα αποθηκευμένα αποτελέσματα, αποφεύγοντας τον περιττό υπολογισμό. Αυτό μειώνει την πολυπλοκότητα του χρόνου από εκθετική σε γραμμική.

Στην ουσία, η υπόμνημα μετατρέπει έναν πιθανώς αναδρομικό αλγόριθμο εκθετικού χρόνου σε έναν αλγόριθμο γραμμικού χρόνου (ή πολυώνυμου χρόνου σε άλλες περιπτώσεις) αξιοποιώντας τη δύναμη της προσωρινής αποθήκευσης που είχαν προηγουμένως υπολογισμένα αποτελέσματα. Είναι μια ισχυρή τεχνική βελτιστοποίησης που χρησιμοποιείται συχνά σε συνδυασμό με τον δυναμικό προγραμματισμό για τη βελτίωση της αποτελεσματικότητας.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα