Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Οι Δομές Δεδομένων Ουρά και Στοίβα
ΓΕ0170 -Αλγόριθμοι και Προηγμένες Προγραμματικές Τεχνικές Οι Δομές Δεδομένων Ουρά και Στοίβα Νίκος Αθανάσης
2
Συμβολισμός Ο Συμβολισμός Ο. Μία συνάρτηση f(n) λέγεται ότι έχει πολυπλοκότητα της τάξης O(g(n)) και συμβολίζεται με f(n) = O(g(n)) ή με f(n) ∈ O(g(n)), αν υπάρχει μία θετική σταθερά c και μία τιμή n0, έτσι ώστε για κάθε n > n0 να ισχύει η σχέση f(n) < c*g(n).
3
Συμβολισμός Ο «Η f (n) είναι πολυπλοκότητας O(g(n)).”
Εναλλακτικά, “ Η f (n) είναι τάξης (order of) g(n).” Εναλλακτικά, “ f (n) ∈ O(g(n))», f(x) ∈ O(‘άνω άκρο’) σημαίνει ότι η f «μεγαλώνει όχι γρηγορότερα από" το ‘’ανω άκρο’ Στον συμβολισμό Ο δεν μας ενδιαφέρουν σταθεροί όροι / μη ασυμπτωτικοί όροι Ο αλγόριθμος τάξης 9x² είναι ίδιας τάξης με τον 10x². ο αλγόριθμος τάξης 10x² είναι ίδιας τάξης με τον 10x² - x διότι, τα μικρότερα μέρη τείνουν να μην έχουν σημασία σε μεγάλη κλίμακα
4
Συμβολισμός Ο Μας ενδιαφέρει ο λόγος καθώς το μέγεθος των δεδομένων τείνουν στο άπειρο
5
Παραδείγματα Η συνάρτηση 8n+5 είναι O(n). Αρκεί να βρούμε μια σταθερά c>0, και μια σταθερά no ώστε 8n+5 ≤ cn για κάθε n ≥ n0. Με c = 9 έχω 8n+5<=9n που ισχύει για κάθε n>=5 ή εναλλακτικά με c = 13 έχω 8n+5<=13n που ισχύει για κάθε n>=1 Η 5n4 +3n3+2n2 +4n+1 είναι O(n4). Διότι: 5n4+3n3+2n2+4n+1≤ ( )n4 = cn4, για c = 15 Η 5n2 +3nlog n+2n+5 is O(n2). Διότι:5n2 +3nlog n+2n+5 ≤( )n2 =cn2, για c=15 Η 20n3 +10nlog n+5 είναι O(n3). Διότι: 20n3 +10nlog n+5 ≤ 35n3, για c=35 H 3logn+2 είναι O(logn). Διότι: 3logn+2 ≤ 5logn, για c=5. H 2n+100log n is O(n). Διότι: 2n+100log n≤ 102n, για c= 102
6
Παραδείγματα Χρόνος εκτέλεσης (=συνολικά βήματα): co * n. Πολυπλοκότητα: Ο(n) Πολυπλοκότητα: ? Πολυπλοκότητα: ?
7
Παραδείγματα Πολυπλοκότητα: ?
8
Η Δομή Δεδομένων Στοίβα
Μια Δομή Δεδομένων Stack (Στοίβα) είναι μια συλλογή από αντικείμενα που προσθέτονται και διαγράφονται με βάση την αρχή: Τελευταίο μέσα, πρώτο έξω last-in, first-out (LIFO) Ο χρήστης μπορεί να προσθέτει αντικείμενα στη στοίβα ανά πάσα στιγμή και έχει πρόβαση κάθε φορά στο τελευταίο χρονικά αντικείμενο που προστέθηκε, όπως ακριβώς γίνεται σε μια στοίβα στο νεροχύτη μας. Kάθε πιάτο που πλένεται τοποθετείται στην κορυφή (top) της στοίβας των πιάτων, ενώ για σκούπισμα λαμβάνεται και πάλι το πιάτο της κορυφής. Τα δεδομένα που βρίσκονται στην κορυφή της στοίβας λαμβάνονται πρώτα, ενώ αυτά που βρίσκονται στο βάθος της στοίβας λαμβάνονται τελευταία. Όταν θέλουμε να προσθέσουμε ένα νέο στοιχείο στη στοίβα κάνουμε push (ώθηση). Όταν θέλουμε να χρησιμοποιήσουμε ένα νέο στοιχείο κάνουμε pop (απώθηση)
9
Η Δομή Δεδομένων Στοίβα
Η διαδικασία της ώθησης πρέπει να ελέγχει, αν η στοίβα είναι γεμάτη, οπότε λέγεται ότι συμβαίνει υπερχείλιση (overflow) της στοίβας. Αντίστοιχα, η διαδικασία απώθησης ελέγχει, αν υπάρχει ένα τουλάχιστον στοιχείο στη στοίβα, δηλαδή ελέγχει αν γίνεται υποχείλιση (underflow) της στοίβας.
10
Λειτουργίες Στοίβας S.push(e): Ώθηση (προσθήκη) ενός αντικειμένου στην κορυφή. Ελεγχος υπερχείλισης S.pop(): Απώθηση (διαγραφή) ενός αντικειμένου από την κορυφή της στοίβας. Έλεγχος υποχείλισης S.top(): Επιστρέφει την κορυφή της στοίβας (χωρίς διαγραφή) S.is empty(): Επιστρέφει True αν η στοίβα δεν περιέχει στοιχεία len(S): Επιστρέφει το μήκος της στοίβας. Λειτουργία Χρόνος εκτέλεσης
11
Λειτουργίες Στοίβας Λειτουργία Επιστρέφει Περιεχόμενα στοίβας
12
Υλοποίηση Στοίβας Μια στοίβα μπορεί να υλοποιηθεί με τη βοήθεια μιας Python List Μέθοδος Αντιστοιχία με Python Περισσότερα στο αρχείο StackClass στο φάκελο του μαθήματος
13
Εφαρμογή στοίβας 1 - Αντιστροφή περιεχομένου ενός αρχείου
Περισσότερα στο αρχείο ReverseFile στο φάκελο του μαθήματος 2 - Ταίριασμα παρενθέσεων σε έκφραση Σωστό: ( )(( )){([( )])} Σωστό: ((( )(( )){([( )])})) Λάθος: )(( )){([( )])} Λάθος: ({[ ])} Λάθος: ( Περισσότερα στο αρχείο Matching στο φάκελο του μαθήματος 3 - Έλεγχος εγκυρότητας html αρχείου Περισσότερα στο αρχείο Matchinghtml στο φάκελο του μαθήματος
14
Η Δομή Δεδομένων Ουρά Οι ουρές είναι καθημερινό φαινόμενο. Για παράδειγμα, ουρές δημιουργούνται όταν άνθρωποι, αυτοκίνητα, εργασίες, προγράμματα κ.λπ. περιμένουν για να εξυπηρετηθούν. Το θέμα είναι τόσο σημαντικό και με τέτοιες πρακτικές επιπτώσεις, ώστε ένας ιδιαίτερος κλάδος των Μαθηματικών και Πληροφορικής, η Θεωρία Ουρών (Queueing Theory), μελετά τη συμπεριφορά και την επίδοση των ουρών. Σε μία ουρά αναμονής εξυπηρετείται εκείνος που στάθηκε στην ουρά πρώτος από όλους τους άλλους (αν και πολύ συχνά στην Ελάδα αυτό δεν ισχύει!) Γραμμή προτεραιότητας
15
Η Δομή Δεδομένων Ουρά Μια Ουρά είναι μια δομή δεδομένων όπου τα αντικείμενα εισέρχονται και διαγράφονται με βάση την αρχή first-in, first-out (FIFO). Έτσι, τα αντικείμενα εισέρχονται ανά πάσα στιγμή στο τέλος της ουράς ενώ αυτό που είναι στην ουρά το περισσότερο διάστημα μπορεί να διαγραφεί και αποτελεί και το πρώτο στοιχείο της ουράς. Δύο είναι οι κύριες λειτουργίες σε μία ουρά: η εισαγωγή (enqueue) στοιχείου στο πίσω άκρο της ουράς, και η εξαγωγή (dequeue) στοιχείου από το εμπρός άκρο της ουράς. Q.enqueue(e): Προσθήκη του στοιχείου e στο πίσω άκρο της ουράς Q. Q.dequeue( ): Διαγραφή και επιστροφή του πρώτου στοιχείου από το εμπρός άκρο της ουράς Q.first(): Επιστρέφει το πρώτο στοιχείο της ουράς. Q.is empty( ): Επιστρέφει True εάν η ουρά Q δεν περιέχει κανένα αντικείμενο len(Q): Επιστρέφει τον αριθμό των αντικειμένων της ουράς
16
Λειτουργίες της Ουράς Λειτουργία Επιστρέφει Περιεχόμενα στοίβας
17
Υλοποίηση Ουράς Η υλοποίηση της ουράς θα μπορούσε να γίνει με τη βοήθεια μιας Python λίστας. Θα μπορούσαμε να εισάγουμε ένα στοιχείο e καλώντας την append(e) ώστε να εισάγεται στο τέλος της λίστας. Θα μπορούσαμε να κάνουμε εξαγωγή καλώντας την pop(0), ώστε να διαγραφεί το πρώτο στοιχείο της λίστας. Όμως, κάτι τέτοιο θα είχε ως αποτελέσμα να εκτελείται σε κάθε εξαγωγή ένας βρόγχος πολυπλοκότητας O(n) για να συμπληρωθεί το κενό που αφήνει η εξαγωγή του πρώτου στοιχείου Μπορούμε να αντιμετωπίσουμε το παραπάνω πρόβλημα αντικαθιστώντας την τιμή της εξαγωγής με το None και διατηρώντας σε μια μεταβλητή f (front index) την αρχή της ουράς. Έτσι, η εξαγωγή θα γίνεται σε χρόνο O(1). Το πρόβλημα που υπάρχει με την παραπάνω υλοποίηση είναι ότι το μήκος της ουράς μεγαλώνει όσο εισάγονται και εξάγονται στοιχεία. Μπορεί να έχω έτσι μια τεράστια λίστα που όμως διατηρεί λίγα στοιχεία
18
Υλοποίηση Ουράς Για να αντιμετωπίσουμε επιτυχώς τα παραπάνω προβλήματα, η ουρά υλοποιείται με μια “κυκλική” λίστα η οποία έχει σταθερό μέγεθος Ν. Κατά την εξαγωγή, ο δείκτης f (αρχή της ουράς) αυξάνεται σε f = (f + 1) % N. Για παράδειγμα, αν έχουμε μια λίστα μεγέθους 10 και η αρχή της ουράς είναι στο 7, μια νέα εξαγωγή θα κάνει την αρχή της ουράς να δείχνει στη θέση (7+1) % 10 = 8. Από τη θέση 9 όμως μια νέα εξαγωγή θα δείχνει την κορυφή της ουράς στη θέση (9+1) % 10 = 0 Νέα στοιχεία εισάγονται στο τέλος της λίστας. Η εισαγωγή γίνεται στη θέση f + μήκος_ουράς+1 Αν το τελευταίο στοιχείο που έχει εισαχθεί βρίσκεται στη θέση N-1 τότε το επόμενο εισάγεται στη θέση 0
19
Υλοποίηση Ουράς Υλοποίηση της κλάσης Queue με τις παρακάτω μεταβλητές αντικειμένου instance variables data: μια λίστα συγκερκριμένου μεγέθους που περιέχει τα στοιχεία τη ουράς size: ένας αριθμός που δείχει το τρέχον μέγεθος της ουράς (δηλαδή το μέγεθος της λίστας) front: ο δείκτης προς το πρώτο στοιχείο της ουράς. Λειτουργία Χρόνος εκτέλεσης Περισσότερα στο αρχείο MyQueue στο φάκελο του μαθήματος
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.