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

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Γλώσσες Προγραμματισμού Υπολογιστών

Ποιος είναι ο πιο αποτελεσματικός τρόπος για την εφαρμογή ενός παράγοντα αλγόριθμο στη γλώσσα προγραμματισμού;

Ο πιο αποτελεσματικός τρόπος για την εφαρμογή ενός παράγοντα αλγόριθμο εξαρτάται από διάφορους παράγοντες, όπως:

* γλώσσα: Οι διαφορετικές γλώσσες έχουν διαφορετικά πλεονεκτήματα και αδυναμίες όσον αφορά τη βελτιστοποίηση.

* Μέγεθος εισόδου: Για μικρές τιμές εισόδου, οι απλές προσεγγίσεις είναι εντάξει. Για πολύ μεγάλες εισροές, οι εξειδικευμένες βιβλιοθήκες γίνονται απαραίτητες.

* Απαιτήσεις ακρίβειας: Οι τυπικοί τύποι δεδομένων όπως το `int` ή το` long 'θα ξεχειλίζουν για μεγαλύτερα παράγοντα. Εάν χρειάζεστε την ακριβή τιμή, θα χρειαστείτε αριθμητική αυθαίρετη ακρίβεια.

Ακολουθεί μια κατανομή διαφορετικών προσεγγίσεων, από απλούστερη έως πιο περίπλοκη και αποτελεσματική, μαζί με τα πλεονεκτήματα και τα μειονεκτήματά τους:

1. Αναδρομική προσέγγιση (απλή αλλά όχι πάντα αποτελεσματική)

`` `Python

def factorial_recursive (n):

"" "

Υπολογίζει το παράγοντα χρησιμοποιώντας την επανάληψη.

"" "

Εάν n ==0:

επιστροφή 1

αλλού:

Επιστροφή n * factorial_recursive (n - 1)

`` `

* Πλεονεκτήματα: Εύκολη κατανόηση και εφαρμογή. Αντικατοπτρίζει τον μαθηματικό ορισμό.

* μειονεκτήματα: Σε πολλές γλώσσες, η επανάληψη είναι σχετικά αργή λόγω των γενικών κλήσεων. Επίσης, η επανάληψη μπορεί να οδηγήσει σε σφάλματα υπερχείλισης στοίβας για μεγαλύτερες τιμές «n» εάν η γλώσσα δεν βελτιστοποιεί την επανάληψη της ουράς.

2. Επαναληπτική προσέγγιση (γενικά πιο αποτελεσματική)

`` `Python

def factorial_iterative (n):

"" "

Υπολογίζει το παράγοντα χρησιμοποιώντας την επανάληψη (βρόχος).

"" "

Αποτέλεσμα =1

για το I στην περιοχή (1, n + 1):

Αποτέλεσμα *=i

αποτέλεσμα επιστροφής

`` `

* Πλεονεκτήματα: Γενικά ταχύτερα από την επανάληψη, επειδή αποφεύγει το γενικό σύστημα κλήσεων. Λιγότερο πιθανό να προκαλέσει υπερχείλιση στοίβας.

* μειονεκτήματα: Εξακολουθεί να περιορίζεται από το μέγεθος του τύπου δεδομένων.

3. Προσέγγιση της ουράς (βελτιστοποιημένη σε ορισμένες γλώσσες)

`` `Python

def factorial_tail_recursive_helper (n, συσσωρευτής =1):

"" "Λειτουργία βοηθού για παραγόμενο από την ουρά." ""

Εάν n ==0:

Επιστροφή συσσωρευτή

αλλού:

επιστροφή factorial_tail_recursive_helper (n - 1, n * συσσωρευτής)

def factorial_tail_recursive (n):

"" "

Υπολογίζει το παράγοντα χρησιμοποιώντας την επανάληψη της ουράς.

"" "

επιστροφή factorial_tail_recursive_helper (n)

`` `

* Πλεονεκτήματα: Εάν η γλώσσα * υποστηρίζει τη βελτιστοποίηση του Tail-Call (TCO), αυτό είναι τόσο αποτελεσματικό όσο η επαναληπτική προσέγγιση επειδή ο μεταγλωττιστής μπορεί να μετατρέψει την επανάληψη της ουράς σε βρόχο.

* μειονεκτήματα: Δεν υποστηρίζουν όλες οι γλώσσες TCO. Η Python, για παράδειγμα, δεν * βελτιστοποιεί τις κλήσεις ουράς. Έτσι, στην Python, αυτή η έκδοση είναι ακόμα πιο αργή και μπορεί να προκαλέσει υπερχείλιση στοίβας για μεγάλο `n`.

4. Memoization (Dynamic Programming) - Για επαναλαμβανόμενους υπολογισμούς

Εάν πρέπει να υπολογίσετε το παράγοντα πολλών διαφορετικών τιμών και υπάρχει πιθανότητα να υπολογίσετε το παράγοντα της ίδιας τιμής πολλές φορές, η ενίσχυση μπορεί να είναι πολύ αποτελεσματική:

`` `Python

def factorial_memoized (n, memo ={}):

"" "

Υπολογίζει το παράγοντα χρησιμοποιώντας τα υπόμνημα.

"" "

Εάν n σε σημείωμα:

επιστροφή σημείωμα [n]

Εάν n ==0:

Αποτέλεσμα =1

αλλού:

αποτέλεσμα =n * factorial_memoized (n-1, σημείωμα)

σημείωμα [n] =αποτέλεσμα

αποτέλεσμα επιστροφής

`` `

* Πλεονεκτήματα: Εξαιρετικά αποτελεσματική εάν υπολογίζετε τα παράγοντα για πολλές τιμές, ειδικά εάν επαναλαμβάνονται ορισμένες τιμές. Υπολογίζει κάθε παράγοντα μόνο μία φορά.

* μειονεκτήματα: Προσθέτει πάνω από το κεφάλι για τον πίνακα υπόμνησης (το λεξικό «memo» σε αυτό το παράδειγμα).

5. Χρησιμοποιώντας βιβλιοθήκες για μεγάλους αριθμούς (αυθαίρετη αριθμητική ακρίβεια)

Όταν το "n` γίνεται μεγάλο, ακόμη και οι" μακρύς "τύποι δεδομένων θα ξεχειλίσουν. Για να υπολογίσετε τα ακριβή παράγοντα για το μεγάλο «n», πρέπει να χρησιμοποιήσετε βιβλιοθήκες που υποστηρίζουν αυθαίρετη αριθμητική ακρίβεια (που ονομάζονται επίσης βιβλιοθήκες "bignum").

`` `Python

εισαγωγή μαθηματικών

def factorial_with_math (n):

"" "

Υπολογίζει το Factorial χρησιμοποιώντας τη βιβλιοθήκη μαθηματικών της Python (μπορεί να χειριστεί μεγαλύτερους αριθμούς).

Αυτή είναι γενικά η προτιμώμενη προσέγγιση στην Python.

"" "

Επιστροφή Math.Factorial (n)

Παράδειγμα χρήσης με μεγάλους αριθμούς:

αποτέλεσμα =factorial_with_math (100) # υπολογισμός 100!

εκτύπωση (αποτέλεσμα)

`` `

* Πλεονεκτήματα: Υπολογίζει με ακρίβεια τα παράγοντα για πολύ μεγάλες τιμές του «n». Χειρίζεται αριθμούς πολύ πέρα ​​από τα όρια των τυποποιημένων τύπων ακέραιων τύπων.

* μειονεκτήματα: Απαιτεί μια εξωτερική βιβλιοθήκη ή ενσωματωμένη υποστήριξη γλωσσών για την αριθμητική αυθαίρετη ακρίβεια. Μπορεί να είναι ελαφρώς πιο αργή από την απλή αριθμητική ακέραια για μικρότερες τιμές.

6. Προσέγγιση της συνάρτησης γάμμα (για προσεγγίσεις μη ακέραιου παράγοντα)

Για πολύ μεγάλα παράγοντα ή όταν χρειάζεστε μια προσέγγιση της παραγοντικής λειτουργίας για μη ακέραιες τιμές (όπως 5.5!), Μπορείτε να χρησιμοποιήσετε τη λειτουργία Gamma. Η συνάρτηση γάμμα είναι μια γενίκευση της παραγοντικής λειτουργίας σε σύνθετους αριθμούς.

`` `Python

εισαγωγή μαθηματικών

def factorial_aptoximate (n):

"" "

Προσεγγίζει το παράγοντα χρησιμοποιώντας τη συνάρτηση γάμμα (προσέγγιση του Stirling).

"" "

Εάν n <0:

Η αύξηση του ValueError ("Ο παράγοντας δεν ορίζεται για αρνητικούς αριθμούς")

Επιστροφή Math.EXP (Math.LGAMMA (N + 1))

Παράδειγμα χρήσης:

Appleximate_Factorial =Factorial_Appoximate (100,5)

εκτύπωση (Appleximate_Factorial)

`` `

* Πλεονεκτήματα: Μπορεί να χειριστεί πολύ μεγάλους αριθμούς. Επεκτείνει τη συνάρτηση παράγοντα σε μη ακέραιες τιμές. Η προσέγγιση του Stirling παρέχει μια καλή προσέγγιση για το μεγάλο «n».

* μειονεκτήματα: Επιστρέφει μια *προσέγγιση *, όχι την ακριβή τιμή ακέραιου αριθμού.

Επιλέγοντας την καλύτερη προσέγγιση

* Μικρό «n» (έως ~ 12): Η απλή επαναληπτική προσέγγιση είναι συνήθως ο καλύτερος συνδυασμός ταχύτητας και αναγνωσιμότητας.

* Μέσο `n` (μέχρι το όριο του τύπου 'Long'): Η επαναληπτική προσέγγιση είναι ακόμα καλή. Εξετάστε το υπόμνημα εάν πρέπει να υπολογίσετε διάφορα παράγοντα, ενδεχομένως με επικαλυπτόμενες εισροές.

* Μεγάλο `n` (πέρα από τα όρια του 'long'): Χρησιμοποιήστε μια βιβλιοθήκη με αυθαίρετη αριθμητική ακρίβεια, όπως το `math.factorial 'της Python ή μια παρόμοια βιβλιοθήκη σε άλλες γλώσσες.

* πολύ μεγάλες τιμές `n` ή μη ακέραιου αριθμού: Χρησιμοποιήστε την προσέγγιση της συνάρτησης γάμμα.

Σημαντικές εκτιμήσεις για βελτιστοποίηση:

* υπερχείλιση τύπου δεδομένων: Πάντα να γνωρίζετε τους περιορισμούς των τύπων δεδομένων σας. Χρησιμοποιήστε την Αριθμητική Αριθμητική "Long" ή αυθαίρετη ακρίβεια όταν είναι απαραίτητο.

* Χαρακτηριστικά γλώσσας: Επωφεληθείτε από τις ενσωματωμένες λειτουργίες και τις βιβλιοθήκες στη γλώσσα σας. Για παράδειγμα, το `Math.Factorial 'της Python είναι εξαιρετικά βελτιστοποιημένο.

* Benchmarking: Εάν η απόδοση είναι κρίσιμη, αναφέρετε διαφορετικές υλοποιήσεις για να δείτε ποιο είναι το καλύτερο για τη συγκεκριμένη περίπτωση χρήσης σας.

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

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

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