Τι είναι το Big-O Notation;

Τι είναι το Big-O Notation;

Έχετε αναρωτηθεί ποτέ γιατί ένα πρόγραμμα που γράψατε χρειάστηκε τόσο πολύ για να τρέξει; Perhapsσως θα θέλατε να μάθετε αν μπορείτε να κάνετε τον κώδικά σας πιο αποτελεσματικό. Η κατανόηση του τρόπου εκτέλεσης κώδικα μπορεί να φέρει τον κώδικά σας στο επόμενο επίπεδο. Η σημειογραφία Big-O είναι ένα εύχρηστο εργαλείο για να υπολογίσετε πόσο αποτελεσματικός είναι ο κώδικας σας.





Τι είναι το Big-O Notation;

Ο συμβολισμός Big-O σάς δίνει έναν τρόπο να υπολογίσετε πόσο χρόνο θα χρειαστεί για να εκτελεστεί ο κώδικά σας. Μπορείτε φυσικά να χρονομετρήσετε πόσο χρόνο χρειάζεται ο κώδικας για να εκτελεστεί, αλλά με αυτήν τη μέθοδο, είναι δύσκολο να εντοπίσετε μικρές χρονικές διαφορές. Για παράδειγμα, ο χρόνος που απαιτείται μεταξύ της εκτέλεσης 20 και 50 γραμμών κώδικα είναι πολύ μικρός. Ωστόσο, σε ένα μεγάλο πρόγραμμα, αυτές οι ανεπάρκειες μπορούν να αθροιστούν.





tcl roku τηλεχειριστήριο δεν λειτουργεί

Ο συμβολισμός Big-O μετρά πόσα βήματα πρέπει να εκτελέσει ένας αλγόριθμος για να μετρήσει την αποτελεσματικότητά του. Η προσέγγιση του κώδικα με αυτόν τον τρόπο μπορεί να είναι πολύ αποτελεσματική εάν πρέπει να ρυθμίσετε τον κώδικά σας για να αυξήσετε την αποτελεσματικότητά του. Ο συμβολισμός Big-O θα σας επιτρέψει να μετρήσετε διαφορετικούς αλγόριθμους με τον αριθμό των βημάτων που απαιτούνται για την εκτέλεσή του και να συγκρίνετε αντικειμενικά την αποδοτικότητα των αλγορίθμων.





Πώς υπολογίζετε τη σημείωση Big-O

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

Αλγόριθμος 1:



def sockCounter(numberOfPairs):
individualSocks = 0
for x in range(numberOfPairs):
individualSocks = individualSocks + 2
return individualSocks

Αλγόριθμος 2:

def sockCounter(numberOfPairs):
return numberOfPairs * 2

Αυτό είναι ένα ανόητο παράδειγμα και θα πρέπει να μπορείτε εύκολα να πείτε ποιος αλγόριθμος είναι πιο αποτελεσματικός. Αλλά για εξάσκηση, ας περάσουμε το καθένα.





ΣΧΕΤΙΖΕΤΑΙ ΜΕ: Τι είναι μια λειτουργία στον προγραμματισμό;

Ο αλγόριθμος 1 έχει πολλά βήματα:





  1. Εκχωρεί μια τιμή μηδέν στη μεταβλητή individualSocks.
  2. Εκχωρεί μια τιμή στη μεταβλητή i.
  3. Συγκρίνει την τιμή του i με το numberOfPairs.
  4. Προσθέτει δύο στα individualSocks.
  5. Εκχωρεί την αυξημένη αξία των individualSocks στον εαυτό του.
  6. Αυξάνει το i κατά ένα.
  7. Στη συνέχεια, επιστρέφει στα βήματα 3 έως 6 για τον ίδιο αριθμό φορές όπως (indiviualSocks - 1).

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

4n + 2

Υπάρχουν τέσσερα βήματα που πρέπει να ολοκληρώσουμε n φορές. Σε αυτή την περίπτωση, το n θα ισούται με την τιμή του numberOfPairs. Υπάρχουν επίσης 2 βήματα που ολοκληρώνονται μία φορά.

Σε σύγκριση, ο αλγόριθμος 2 έχει μόνο ένα βήμα. Η τιμή του numberOfPairs πολλαπλασιάζεται με δύο. Θα το εκφράζαμε ως εξής:

1

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

Ανάλυση Big-O

Γενικά, όταν ενδιαφέρεστε για τη σημείωση Big-O ενός αλγορίθμου, ενδιαφέρεστε περισσότερο για τη συνολική απόδοση και λιγότερο για την λεπτομερή ανάλυση του αριθμού των βημάτων. Για να απλοποιήσουμε τον συμβολισμό, μπορούμε απλά να δηλώσουμε το μέγεθος της απόδοσης.

Στα παραπάνω παραδείγματα, ο αλγόριθμος 2 εκφράζεται ως ένας:

O(1)

Αλλά ο αλγόριθμος 1 θα απλοποιηθεί ως εξής:

O(n)

Αυτό το γρήγορο στιγμιότυπο μας λέει πώς η αποδοτικότητα του αλγορίθμου 1 συνδέεται με την τιμή του n. Όσο μεγαλύτερος είναι ο αριθμός, τόσο περισσότερα βήματα θα χρειαστεί να ολοκληρώσει ο αλγόριθμος.

Γραμμικός Κώδικας

Πιστωτική εικόνα: Nick Fledderus/ Ονομαστικό έργο

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

Τετραγωνικός Κώδικας

Δεν είναι όλες οι σχέσεις τόσο απλές όσο το γραμμικό παράδειγμα. Φανταστείτε ότι έχετε έναν πίνακα 2D και θα θέλατε να αναζητήσετε μια τιμή στον πίνακα. Μπορείτε να δημιουργήσετε έναν αλγόριθμο σαν αυτόν:

def searchForValue(targetValue, arraySearched):
foundTarget = False
for x in arraySearched:
for y in x:
if(y == targetValue):
foundTarget = True
return foundTarget

Σε αυτό το παράδειγμα, ο αριθμός των βημάτων εξαρτάται από τον αριθμό των συστοιχιών στο arraySearched και τον αριθμό των τιμών σε κάθε πίνακα. Έτσι, ο απλοποιημένος αριθμός βημάτων θα ήταν n * n ή n².

τα παράθυρα 10 απενεργοποιούν τη συντόμευση οθόνης

Πιστωτική εικόνα: Nick Fledderus/ Ονομαστικό έργο

Αυτή η σχέση είναι μια τετραγωνική σχέση, που σημαίνει ότι ο αριθμός των βημάτων στον αλγόριθμό μας αυξάνεται εκθετικά με το n. Σε σημειογραφία Big-O, θα το γράφατε ως:

O(n²)

ΣΧΕΤΙΖΕΤΑΙ ΜΕ: Χρήσιμα εργαλεία για τον έλεγχο, τον καθαρισμό και τη βελτιστοποίηση αρχείων CSS

Λογαριθμικός Κώδικας

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

log 2 (8) = 3

Το ημερολόγιο ισούται με τρία γιατί αν η βάση μας ήταν 2, θα χρειαζόμασταν μια τιμή εκθέτη 3 για να φτάσουμε στον αριθμό 8.

Πιστωτική εικόνα: Nick Fledderus/ Ονομαστικό έργο

Έτσι, η σχέση μιας λογαριθμικής συνάρτησης είναι το αντίθετο μιας εκθετικής σχέσης. Καθώς το n αυξάνεται, απαιτούνται λιγότερα νέα βήματα για την εκτέλεση του αλγορίθμου.

Με μια πρώτη ματιά, αυτό φαίνεται αντι-διαισθητικό. Πώς μπορούν τα βήματα ενός αλγορίθμου να αυξηθούν πιο αργά από το n; Ένα καλό παράδειγμα για αυτό είναι οι δυαδικές αναζητήσεις. Ας εξετάσουμε έναν αλγόριθμο για την αναζήτηση ενός αριθμού σε μια σειρά από μοναδικές τιμές.

  • Θα ξεκινήσουμε με έναν πίνακα αναζήτησης που έχει τη σειρά από μικρότερο προς μεγαλύτερο.
  • Στη συνέχεια, θα ελέγξουμε την τιμή στη μέση του πίνακα.
  • Εάν ο αριθμός σας είναι υψηλότερος, θα αποκλείσουμε τους χαμηλότερους αριθμούς στην αναζήτησή μας και εάν ο αριθμός ήταν μικρότερος, θα εξαιρέσουμε τους υψηλότερους αριθμούς.
  • Τώρα, θα δούμε τον μεσαίο αριθμό των υπόλοιπων αριθμών.
  • Και πάλι, θα εξαιρέσουμε τους μισούς αριθμούς με βάση το αν η τιμή -στόχος μας είναι υψηλότερη ή χαμηλότερη από τη μεσαία τιμή.
  • Θα συνεχίσουμε αυτή τη διαδικασία μέχρι να βρούμε τον στόχο μας ή να διαπιστώσουμε ότι δεν υπάρχει στη λίστα.

Όπως μπορείτε να δείτε, αφού οι δυαδικές αναζητήσεις εξαλείφουν τις μισές πιθανές τιμές κάθε πέρασμα, καθώς το n γίνεται μεγαλύτερο, η επίδραση στον αριθμό των φορών που ελέγχουμε τον πίνακα επηρεάζεται ελάχιστα. Για να το εκφράσουμε με συμβολισμό Big-O, θα γράφαμε:

O(log(n))

Η σημασία της σημειογραφίας Big-O

Το Big-O nation σας δίνει έναν γρήγορο και εύκολο τρόπο επικοινωνίας πόσο αποδοτικός είναι ένας αλγόριθμος. Αυτό καθιστά ευκολότερη την επιλογή μεταξύ διαφορετικών αλγορίθμων. Αυτό μπορεί να είναι ιδιαίτερα χρήσιμο εάν χρησιμοποιείτε αλγόριθμο από βιβλιοθήκη και δεν γνωρίζετε απαραίτητα πώς μοιάζει ο κώδικας.

πώς να ξέρετε αν ο σκληρός δίσκος είναι νεκρός

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

Μερίδιο Μερίδιο Τιτίβισμα ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ 10 συνηθέστερα λάθη προγραμματισμού και κωδικοποίησης

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

Διαβάστε Επόμενο
Σχετικά θέματα
  • Προγραμματισμός
  • Προγραμματισμός
Σχετικά με τον Συγγραφέα Τζένιφερ Σίτον(Δημοσιεύθηκαν 21 άρθρα)

Ο J. Seaton είναι Επιστημονικός Συγγραφέας που ειδικεύεται στην ανάλυση σύνθετων θεμάτων. Έχει διδακτορικό από το Πανεπιστήμιο του Saskatchewan. η έρευνά της επικεντρώθηκε στη χρήση της μάθησης με βάση τα παιχνίδια για την αύξηση της συμμετοχής των μαθητών στο διαδίκτυο. Όταν δεν εργάζεται, θα τη βρείτε να διαβάζει, να παίζει βιντεοπαιχνίδια ή να ασχολείται με την κηπουρική.

Περισσότερα από την Jennifer Seaton

Εγγραφείτε στο newsletter μας

Εγγραφείτε στο ενημερωτικό μας δελτίο για τεχνικές συμβουλές, κριτικές, δωρεάν ebooks και αποκλειστικές προσφορές!

Κάντε κλικ εδώ για εγγραφή